static void Main(string[] args) { // Try to read the metadata configuration file string app_start_config = Application.StartupPath + "\\config"; if ((Directory.Exists(app_start_config)) && (File.Exists(app_start_config + "\\sobekCM_metadata.config"))) { Metadata_Configuration.Read_Metadata_Configuration(app_start_config + "\\sobekCM_metadata.config"); } bool complete_static_rebuild = false; bool marc_rebuild = false; bool run_preloader = true; bool run_background = false; bool show_help = false; bool build_production_marcxml_feed = false; bool build_test_marcxml_feed = false; string invalid_arg = String.Empty; bool refresh_oai = false; bool verbose = false; // Get values from the arguments foreach (string thisArgs in args) { bool arg_handled = false; // Check for the config flag if (thisArgs == "--config") { if (File.Exists(app_start_config + "\\SobekCM_Builder_Configuration.exe")) { Process.Start(app_start_config + "\\SobekCM_Builder_Configuration.exe"); return; } Console.WriteLine("ERROR: Unable to find configuration executable file!!"); return; } // Check for versioning option if (thisArgs == "--version") { Console.WriteLine("You are running version " + SobekCM_Library_Settings.CURRENT_BUILDER_VERSION + " of the SobekCM Builder."); return; } // Check for no loader flag if (thisArgs == "--background") { run_background = true; arg_handled = true; } // Check for verbose flag if (thisArgs == "--verbose") { verbose = true; arg_handled = true; } // Check for no loader flag if (thisArgs == "--refresh_oai") { refresh_oai = true; arg_handled = true; } // Check for no oading flag if (thisArgs == "--noload") { run_preloader = false; arg_handled = true; } // Check for static rebuild if (thisArgs == "--staticrebuild") { complete_static_rebuild = true; arg_handled = true; } // Check for static rebuild if (thisArgs == "--createmarc") { marc_rebuild = true; arg_handled = true; } // Check for marc xml feed creation flags if (thisArgs.IndexOf("--marcxml") == 0) { build_production_marcxml_feed = true; arg_handled = true; } if (thisArgs.IndexOf("--testmarcxml") == 0) { build_test_marcxml_feed = true; arg_handled = true; } // Check for help if ((thisArgs == "--help") || (thisArgs == "?") || (thisArgs == "-help")) { show_help = true; arg_handled = true; } // If not handled, set as error if (!arg_handled) { invalid_arg = thisArgs; break; } } // Was there an invalid argument or was help requested if ((invalid_arg.Length > 0) || (show_help)) { StringBuilder builder = new StringBuilder(); builder.Append("\nThis application is used to bulk load SobekCM items, perform post-processing\n"); builder.Append("for items loaded through the web, and perform some regular maintenance activities\n"); builder.Append("in support of a SobekCM web application.\n\n"); builder.Append("Usage: SobekCM_Builder [options]\n\n"); builder.Append("Options:\n\n"); builder.Append(" --config\tRuns the configuration tool\n\n"); builder.Append(" --version\tDisplays the current version of the SobekCM Builder\n\n"); builder.Append(" --verbose\tFlag indicates to be verbose in the logs and console\n\n"); builder.Append(" --background\tContinues to run in the background\n\n"); builder.Append(" --help\t\tShows these instructions\n\n"); builder.Append(" --noload\t\tSupresses the loading portion of the SobekCM Builder\n\n"); builder.Append(" --staticrebuild\tPerform a complete rebuild on static pages\n\n"); builder.Append(" --marcxml\tBuild the marcxml production feed\n\n"); builder.Append(" --testmarcxml\tBuild the marcxml test feed\n\n"); builder.Append(" --createmarc\tRecreate all of the MARC.xml files\n\n"); builder.Append(" --refresh_oai\tResave the OAI-PMH DC data for every item in the library\n\n"); builder.Append("Examples:\n\n"); builder.Append(" 1. To just rebuild all the static pages:\n"); builder.Append(" SobekCM_Builder --nopreload --noload --staticrebuild"); builder.Append(" 2. To have the SobekCM Builder constantly run in the background"); builder.Append(" SobekCM_Builder --background"); // If invalid arg, save to log file if (invalid_arg.Length > 0) { // Show INVALID ARGUMENT error in console Console.WriteLine("\nINVALID ARGUMENT PROVIDED ( " + invalid_arg + " )"); } Console.WriteLine(builder.ToString()); return; } // Now, veryify the configuration file exists string config_file = Application.StartupPath + "\\config\\sobekcm.config"; if (!File.Exists(config_file)) { Console.WriteLine("The configuration file is missing!!\n"); Console.Write("Would you like to run the configuration tool? [Y/N]: "); string result = Console.ReadLine().ToUpper(); if ((result == "Y") || (result == "YES")) { // Does the config app exist? if (File.Exists(Application.StartupPath + "\\config\\SobekCM_Builder_Configuration.exe")) { // Run the config app Process configProcess = new Process { StartInfo = { FileName = Application.StartupPath + "\\config\\SobekCM_Builder_Configuration.exe" } }; configProcess.Start(); configProcess.WaitForExit(); // If still no config file, just abort if (!File.Exists(config_file)) { Console.WriteLine("Execution aborted due to missing configuration file."); return; } } else { Console.WriteLine("ERROR: Unable to find configuration executable file!!"); return; } } else { Console.WriteLine("Execution aborted due to missing configuration file."); return; } } // Should be a config file now, so read it SobekCM_Library_Settings.Read_Configuration_File(config_file); if ((SobekCM_Library_Settings.Database_Connections.Count == 0) || (SobekCM_Library_Settings.Database_Connections[0].Connection_String.Length == 0)) { Console.WriteLine("Missing database connection string!!\n"); Console.Write("Would you like to run the configuration tool? [Y/N]: "); string result = Console.ReadLine().ToUpper(); if ((result == "Y") || (result == "YES")) { // Does the config app exist? if (File.Exists(Application.StartupPath + "\\config\\SobekCM_Builder_Configuration.exe")) { // Run the config app Process configProcess = new Process { StartInfo = { FileName = Application.StartupPath + "\\config\\SobekCM_Builder_Configuration.exe" } }; configProcess.Start(); configProcess.WaitForExit(); // If still no config file, just abort if (!File.Exists(config_file)) { Console.WriteLine("Execution aborted due to missing configuration file."); return; } } else { Console.WriteLine("ERROR: Unable to find configuration executable file!!"); return; } } else { Console.WriteLine("Execution aborted due to missing configuration file."); return; } } // Assign the connection string and test the connection (if only a single connection listed) if (SobekCM_Library_Settings.Database_Connections.Count == 1) { SobekCM_Database.Connection_String = SobekCM_Library_Settings.Database_Connections[0].Connection_String; if (!SobekCM_Database.Test_Connection()) { Console.WriteLine("Unable to connect to the database using provided connection string:"); Console.WriteLine(); Console.WriteLine(SobekCM_Database.Connection_String); Console.WriteLine(); Console.WriteLine("Run this application with an argument of '--config' to launch the configuration tool."); return; } } // Verify connectivity and rights on the logs subfolder SobekCM_Library_Settings.Local_Log_Directory = Application.StartupPath + "\\logs"; if (!Directory.Exists(SobekCM_Library_Settings.Local_Log_Directory)) { try { Directory.CreateDirectory(SobekCM_Library_Settings.Local_Log_Directory); } catch { Console.WriteLine("Error creating necessary logs subfolder under the application folder.\n"); Console.WriteLine("Please create manually.\n"); Console.WriteLine(SobekCM_Library_Settings.Local_Log_Directory); return; } } try { StreamWriter testWriter = new StreamWriter(SobekCM_Library_Settings.Local_Log_Directory + "\\test.log", false); testWriter.WriteLine("TEST"); testWriter.Flush(); testWriter.Close(); File.Delete(SobekCM_Library_Settings.Local_Log_Directory + "\\test.log"); } catch { Console.WriteLine("The service account needs modify rights on the logs subfolder.\n"); Console.WriteLine("Please correct manually.\n"); Console.WriteLine(SobekCM_Library_Settings.Local_Log_Directory); return; } // Look for Ghostscript from the registry, if not provided in the config file if (SobekCM_Library_Settings.Ghostscript_Executable.Length == 0) { // LOOK FOR THE GHOSTSCRIPT DIRECTORY string possible_ghost = Look_For_Variable_Registry_Key("SOFTWARE\\GPL Ghostscript", "GS_DLL"); if (!String.IsNullOrEmpty(possible_ghost)) { SobekCM_Library_Settings.Ghostscript_Executable = possible_ghost; } } // Look for Imagemagick from the registry, if not provided in the config file string possible_imagemagick = Look_For_Variable_Registry_Key("SOFTWARE\\ImageMagick", "BinPath"); if (!String.IsNullOrEmpty(possible_imagemagick)) { SobekCM_Library_Settings.ImageMagick_Executable = possible_imagemagick; } // If this is to refresh the OAI, don't use the worker controller if ((refresh_oai) && (SobekCM_Library_Settings.Database_Connections.Count == 1)) { // Set the item for the current mode int successes = 0; DataTable item_list_table = SobekCM_Database.Get_All_Groups_First_VID( ); foreach (DataRow thisRow in item_list_table.Rows) { string bibid = thisRow["BibID"].ToString(); string vid = thisRow["VID"].ToString(); int groupid = Convert.ToInt32(thisRow["groupid"]); string directory = SobekCM_Library_Settings.Image_Server_Network + bibid.Substring(0, 2) + "\\" + bibid.Substring(2, 2) + "\\" + bibid.Substring(4, 2) + "\\" + bibid.Substring(6, 2) + "\\" + bibid.Substring(8, 2) + "\\" + vid; string mets = directory + "\\" + bibid + "_" + vid + ".mets.xml"; try { SobekCM_Item thisItem = SobekCM_Item.Read_METS(mets); if (thisItem != null) { // Get the OAI-PMH dublin core information StringBuilder oaiDataBuilder = new StringBuilder(1000); StringWriter writer = new StringWriter(oaiDataBuilder); DC_METS_dmdSec_ReaderWriter.Write_Simple_Dublin_Core(writer, thisItem.Bib_Info); // Also add the URL as identifier oaiDataBuilder.AppendLine("<dc:identifier>" + SobekCM_Library_Settings.System_Base_URL + bibid + "</dc:identifier>"); Resource_Object.Database.SobekCM_Database.Save_Item_Group_OAI(groupid, oaiDataBuilder.ToString(), "oai_dc", true); writer.Flush(); writer.Close(); successes++; if (successes % 1000 == 0) { Console.WriteLine(@"{0} complete", successes); } } } catch { } } return; } // Two ways to run this... constantly in background or once Worker_Controller controller = new Worker_Controller(verbose); if (!run_background) { controller.Execute_Immediately(build_production_marcxml_feed, build_test_marcxml_feed, run_preloader, complete_static_rebuild, marc_rebuild); } else { controller.Execute_In_Background(); } // If this was set to aborting, set to last execution aborted Builder_Operation_Flag_Enum operationFlag = Abort_Database_Mechanism.Builder_Operation_Flag; if ((operationFlag == Builder_Operation_Flag_Enum.ABORTING) || (operationFlag == Builder_Operation_Flag_Enum.ABORT_REQUESTED)) { Abort_Database_Mechanism.Builder_Operation_Flag = Builder_Operation_Flag_Enum.LAST_EXECUTION_ABORTED; } }
/// <summary> Verifies that each global object is built and builds them upon request </summary> /// <param name="Tracer"> Trace object keeps a list of each method executed and important milestones in rendering </param> /// <param name="Reload_All"> Flag indicates if everything should be reloaded/repopulated</param> /// <param name="Skins"> [REF] Collection of all the web skins </param> /// <param name="Translator"> [REF] Language support object which handles simple translational duties </param> /// <param name="Code_Manager"> [REF] List of valid collection codes, including mapping from the Sobek collections to Greenstone collections</param> /// <param name="All_Items_Lookup"> [REF] Lookup object used to pull basic information about any item loaded into this library </param> /// <param name="Icon_Dictionary"> [REF] Dictionary of information about every wordmark/icon in this digital library </param> /// <param name="Stats_Date_Range"> [REF] Object contains the start and end dates for the statistical data in the database </param> /// <param name="Thematic_Headings"> [REF] Headings under which all the highlighted collections on the main home page are organized </param> /// <param name="Aggregation_Aliases"> [REF] List of all existing aliases for existing aggregations </param> /// <param name="IP_Restrictions"> [REF] List of all IP Restriction ranges in use by this digital library </param> /// <param name="URL_Portals"> [REF] List of all web portals into this system </param> /// <param name="Mime_Types">[REF] Dictionary of MIME types by extension</param> public static void Build_Application_State(Custom_Tracer Tracer, bool Reload_All, ref SobekCM_Skin_Collection Skins, ref Language_Support_Info Translator, ref Aggregation_Code_Manager Code_Manager, ref Item_Lookup_Object All_Items_Lookup, ref Dictionary <string, Wordmark_Icon> Icon_Dictionary, ref Statistics_Dates Stats_Date_Range, ref List <Thematic_Heading> Thematic_Headings, ref Dictionary <string, string> Aggregation_Aliases, ref IP_Restriction_Ranges IP_Restrictions, ref Portal_List URL_Portals, ref Dictionary <string, Mime_Type_Info> Mime_Types) { // Should we reload the data from the exteral configuraiton file? if (Reload_All) { SobekCM_Library_Settings.Read_Configuration_File(); SobekCM_Database.Connection_String = SobekCM_Library_Settings.Database_Connection_String; SobekCM_Library_Settings.Refresh(SobekCM_Database.Get_Settings_Complete(null)); } // If there is no database connection string, there is a problem if (String.IsNullOrEmpty(SobekCM_Library_Settings.Database_Connection_String)) { throw new ApplicationException("Missing database connection string!"); } // Set the database connection strings Resource_Object.Database.SobekCM_Database.Connection_String = SobekCM_Library_Settings.Database_Connection_String; SobekCM_Database.Connection_String = SobekCM_Library_Settings.Database_Connection_String; // Set the workflow and disposition types if ((SobekCM_Library_Settings.Need_Workflow_And_Disposition_Types) || (Reload_All)) { SobekCM_Library_Settings.Set_Workflow_And_Disposition_Types(SobekCM_Database.All_WorkFlow_Types, SobekCM_Database.All_Possible_Disposition_Types); } // Set the metadata types if ((SobekCM_Library_Settings.Need_Metadata_Types) || (Reload_All)) { SobekCM_Library_Settings.Set_Metadata_Types(SobekCM_Database.Get_Metadata_Fields(null)); } // Set the search stop words if ((SobekCM_Library_Settings.Need_Search_Stop_Words) || (Reload_All)) { SobekCM_Library_Settings.Search_Stop_Words = SobekCM_Database.Search_Stop_Words(Tracer); } // Check the list of thematic headings if ((Thematic_Headings == null) || (Reload_All)) { if (Thematic_Headings != null) { lock (Thematic_Headings) { if (!SobekCM_Database.Populate_Thematic_Headings(Thematic_Headings, Tracer)) { Thematic_Headings = null; throw SobekCM_Database.Last_Exception; } } } else { Thematic_Headings = new List <Thematic_Heading>(); if (!SobekCM_Database.Populate_Thematic_Headings(Thematic_Headings, Tracer)) { Thematic_Headings = null; throw SobekCM_Database.Last_Exception; } } } // Check the list of forwardings if ((Aggregation_Aliases == null) || (Reload_All)) { if (Aggregation_Aliases != null) { lock (Aggregation_Aliases) { SobekCM_Database.Populate_Aggregation_Aliases(Aggregation_Aliases, Tracer); } } else { Aggregation_Aliases = new Dictionary <string, string>(); SobekCM_Database.Populate_Aggregation_Aliases(Aggregation_Aliases, Tracer); } } // Check the list of constant skins if ((Skins == null) || (Skins.Count == 0) || (Reload_All)) { if (Skins != null) { lock (Skins) { SobekCM_Skin_Collection_Builder.Populate_Default_Skins(Skins, Tracer); } } else { Skins = new SobekCM_Skin_Collection(); SobekCM_Skin_Collection_Builder.Populate_Default_Skins(Skins, Tracer); } } // Check the list of all web portals if ((URL_Portals == null) || (URL_Portals.Count == 0) || (Reload_All)) { if (URL_Portals != null) { lock (URL_Portals) { SobekCM_Database.Populate_URL_Portals(URL_Portals, Tracer); } } else { URL_Portals = new Portal_List(); SobekCM_Database.Populate_URL_Portals(URL_Portals, Tracer); } } // Check the translation table has been loaded if ((Translator == null) || (Reload_All)) { // Get the translation hashes into memory if (Translator != null) { lock (Translator) { SobekCM_Database.Populate_Translations(Translator, Tracer); } } else { Translator = new Language_Support_Info(); SobekCM_Database.Populate_Translations(Translator, Tracer); } } // Check that the conversion from SobekCM Codes to Greenstone Codes has been loaded if ((Code_Manager == null) || (Reload_All)) { if (Code_Manager != null) { lock (Code_Manager) { SobekCM_Database.Populate_Code_Manager(Code_Manager, Tracer); } } else { Code_Manager = new Aggregation_Code_Manager(); SobekCM_Database.Populate_Code_Manager(Code_Manager, Tracer); } } // Check the statistics date range information if ((Stats_Date_Range == null) || (Reload_All)) { if (Stats_Date_Range != null) { // Get the translation hashes into memory lock (Stats_Date_Range) { SobekCM_Database.Populate_Statistics_Dates(Stats_Date_Range, Tracer); } } else { Stats_Date_Range = new Statistics_Dates(); SobekCM_Database.Populate_Statistics_Dates(Stats_Date_Range, Tracer); } } // Get the Icon list if ((Icon_Dictionary == null) || (Reload_All)) { if (Icon_Dictionary != null) { // Get the translation hashes into memory lock (Icon_Dictionary) { SobekCM_Database.Populate_Icon_List(Icon_Dictionary, Tracer); } } else { Icon_Dictionary = new Dictionary <string, Wordmark_Icon>(); SobekCM_Database.Populate_Icon_List(Icon_Dictionary, Tracer); } } // Check the list of ip range restrictions if ((IP_Restrictions == null) || (Reload_All)) { if (IP_Restrictions != null) { lock (IP_Restrictions) { DataTable ipRestrictionTbl = SobekCM_Database.Get_IP_Restriction_Ranges(Tracer); if (ipRestrictionTbl != null) { IP_Restrictions.Populate_IP_Ranges(ipRestrictionTbl); } } } else { DataTable ipRestrictionTbl = SobekCM_Database.Get_IP_Restriction_Ranges(Tracer); if (ipRestrictionTbl != null) { IP_Restrictions = new IP_Restriction_Ranges(); IP_Restrictions.Populate_IP_Ranges(ipRestrictionTbl); } } } // Get the MIME type list if ((Mime_Types == null) || (Reload_All)) { if (Mime_Types != null) { // Get the translation hashes into memory lock (Mime_Types) { SobekCM_Database.Populate_MIME_List(Mime_Types, Tracer); } } else { Mime_Types = new Dictionary <string, Mime_Type_Info>(); SobekCM_Database.Populate_MIME_List(Mime_Types, Tracer); } } }