/// <summary> Refreshes the specified builder settings object, from the information pulled from the database </summary>
        /// <param name="SettingsObject"> Current builer settings object to refresh </param>
        /// <param name="SobekCM_Settings"> Dataset of all the builder settings, from the instance database </param>
        /// <param name="IncludeModuleDescriptions"> Flag indicates if the module descriptions should be included for human readability </param>
        /// <returns> TRUE if successful, otherwise FALSE </returns>
        public static bool Refresh(Builder_Settings SettingsObject, DataSet SobekCM_Settings, bool IncludeModuleDescriptions )
        {
            SettingsObject.Clear();
            try
            {
                Dictionary<int, List<Builder_Source_Folder>> folder_to_set_dictionary = new Dictionary<int, List<Builder_Source_Folder>>();
                Dictionary<int, List<Builder_Module_Setting>> setid_to_modules = new Dictionary<int, List<Builder_Module_Setting>>();

                Set_Builder_Folders(SettingsObject, SobekCM_Settings.Tables[0], folder_to_set_dictionary);

                Set_NonScheduled_Modules(SettingsObject, SobekCM_Settings.Tables[1], setid_to_modules, IncludeModuleDescriptions);

                // Link the folders to the builder module sets
                foreach (KeyValuePair<int, List<Builder_Module_Setting>> module in setid_to_modules)
                {
                    if (folder_to_set_dictionary.ContainsKey(module.Key))
                    {
                        List<Builder_Source_Folder> folders = folder_to_set_dictionary[module.Key];
                        foreach (Builder_Source_Folder thisFolder in folders)
                        {
                            thisFolder.Builder_Module_Settings = module.Value;
                        }
                    }
                }

                return true;
            }
            catch
            {
                return false;
            }
        }
        /// <summary> constructor sets all the values to default empty strings </summary>
        public InstanceWide_Settings()
        {
            // Define new empty collections
            dispositionLookup = new Dictionary<int, Disposition_Option>();
            Metadata_Search_Fields = new List<Metadata_Search_Field>();
            metadataFieldsByCode = new Dictionary<string, Metadata_Search_Field>();
            metadataFieldsByID = new Dictionary<short, Metadata_Search_Field>();
            metadataFieldsByFacetName = new Dictionary<string, Metadata_Search_Field>();
            metadataFieldsByDisplayName = new Dictionary<string, Metadata_Search_Field>();
            metadataFieldsByName = new Dictionary<string, Metadata_Search_Field>();
            additionalSettingsDictionary = new Dictionary<string, string>();
            Additional_Settings = new List<Simple_Setting>();
            Workflow_Types = new List<Workflow_Type>();
            Disposition_Options = new List<Disposition_Option>();
            DbItemViewers = new DbItemViewerTypes();

            // Create the child setting objects
            Archive = new Archive_Settings();
            Builder = new Builder_Settings();
            Email = new Email_Settings();
            Florida = new Florida_Settings();
            MarcGeneration = new Marc21_Settings();
            Resources = new Resource_Settings();
            Search = new Search_Settings();
            Servers = new Server_Settings();
            Static = new Static_Settings();
            System = new System_Settings();
            UI = new UI_Settings();
        }
        /// <summary> constructor sets all the values to default empty strings </summary>
        public InstanceWide_Settings()
        {
            // Define new empty collections
            dispositionLookup            = new Dictionary <int, Disposition_Option>();
            Metadata_Search_Fields       = new List <Metadata_Search_Field>();
            metadataFieldsByCode         = new Dictionary <string, Metadata_Search_Field>();
            metadataFieldsByID           = new Dictionary <short, Metadata_Search_Field>();
            metadataFieldsByFacetName    = new Dictionary <string, Metadata_Search_Field>();
            metadataFieldsByDisplayName  = new Dictionary <string, Metadata_Search_Field>();
            metadataFieldsByName         = new Dictionary <string, Metadata_Search_Field>();
            additionalSettingsDictionary = new Dictionary <string, string>();
            Additional_Settings          = new List <Simple_Setting>();
            Workflow_Types      = new List <Workflow_Type>();
            Disposition_Options = new List <Disposition_Option>();
            DbItemViewers       = new DbItemViewerTypes();

            // Create the child setting objects
            Archive        = new Archive_Settings();
            Builder        = new Builder_Settings();
            Email          = new Email_Settings();
            Florida        = new Florida_Settings();
            MarcGeneration = new Marc21_Settings();
            Resources      = new Resource_Settings();
            Search         = new Search_Settings();
            Servers        = new Server_Settings();
            Static         = new Static_Settings();
            System         = new System_Settings();
            UI             = new UI_Settings();
        }
        /// <summary> Constructor for a new instance of the Builder_Modules class </summary>
        /// <param name="Settings"> Setting information </param>
        public Builder_Modules(Builder_Settings Settings )
        {
            settings = Settings;

            preProcessModules = new List<iPreProcessModule>();
            processItemModules = new List<iSubmissionPackageModule>();
            deleteItemModules = new List<iSubmissionPackageModule>();
            postProcessModules = new List<iPostProcessModule>();

            allFolderModules = new List<iFolderModule>();
            assemblyClassToModule = new Dictionary<string, iFolderModule>();
        }
        /// <summary> constructor sets all the values to default empty strings </summary>
        public InstanceWide_Settings()
        {
            try
            {
                // Set some default values
                Database_Connections = new List<Database_Instance_Configuration>();

                Base_SobekCM_Location_Relative = String.Empty;

                Metadata_Help_URL_Base = String.Empty;
                Help_URL_Base = String.Empty;

                Kakadu_JP2_Create_Command = String.Empty;
                OCR_Command_Prompt = String.Empty;
                Builder_Override_Seconds_Between_Polls = -1;

                isHosted = false;

                // Define new empty collections
                dispositionLookup = new Dictionary<int, Disposition_Option>();
                Metadata_Search_Fields = new List<Metadata_Search_Field>();
                metadataFieldsByCode = new Dictionary<string, Metadata_Search_Field>();
                metadataFieldsByID = new Dictionary<short, Metadata_Search_Field>();
                metadataFieldsByFacetName = new Dictionary<string, Metadata_Search_Field>();
                metadataFieldsByDisplayName = new Dictionary<string, Metadata_Search_Field>();
                metadataFieldsByName = new Dictionary<string, Metadata_Search_Field>();
                Additional_Settings = new Dictionary<string, string>();
                Workflow_Types = new List<Workflow_Type>();
                Disposition_Options = new List<Disposition_Option>();

                // Create the child setting objects
                Archive = new Archive_Settings();
                Builder = new Builder_Settings();
                Email = new Email_Settings();
                Florida = new Florida_Settings();
                MarcGeneration = new Marc21_Settings();
                Resources = new Resource_Settings();
                Search = new Search_Settings();
                Servers = new Server_Settings();
                System = new System_Settings();
            }
            catch (Exception ee)
            {
                // Do nothing here

            }
        }
        private static void Set_Builder_Folders(Builder_Settings SettingsObject, DataTable BuilderFoldersTable, Dictionary<int, List<Builder_Source_Folder>> FolderToSetDictionary)
        {
            SettingsObject.IncomingFolders.Clear();
            foreach (DataRow thisRow in BuilderFoldersTable.Rows)
            {
                Builder_Source_Folder newFolder = new Builder_Source_Folder
                {
                    Folder_Name = thisRow["FolderName"].ToString(),
                    Inbound_Folder = thisRow["NetworkFolder"].ToString(),
                    Failures_Folder = thisRow["ErrorFolder"].ToString(),
                    Processing_Folder = thisRow["ProcessingFolder"].ToString(),
                    Perform_Checksum = Convert.ToBoolean(thisRow["Perform_Checksum_Validation"]),
                    Archive_TIFFs = Convert.ToBoolean(thisRow["Archive_TIFF"]),
                    Archive_All_Files = Convert.ToBoolean(thisRow["Archive_All_Files"]),
                    Allow_Deletes = Convert.ToBoolean(thisRow["Allow_Deletes"]),
                    Allow_Folders_No_Metadata = Convert.ToBoolean(thisRow["Allow_Folders_No_Metadata"]),
                    Allow_Metadata_Updates = Convert.ToBoolean(thisRow["Allow_Metadata_Updates"]),
                    BibID_Roots_Restrictions = thisRow["BibID_Roots_Restrictions"].ToString(),
                    Builder_Module_SetID = Convert.ToInt32(thisRow["ModuleSetID"])
                };

                //if (thisRow["Can_Move_To_Content_Folder"] == DBNull.Value)
                //    newFolder.Can_Move_To_Content_Folder = null;
                //else
                //    newFolder.Can_Move_To_Content_Folder = Convert.ToBoolean(thisRow["Can_Move_To_Content_Folder"]);

                if (( thisRow["ModuleSetID"] != null) && ( thisRow["ModuleSetID"].ToString().Length > 0 ))
                {
                    int id = Int32.Parse(thisRow["ModuleSetID"].ToString());
                    if (FolderToSetDictionary.ContainsKey(id))
                        FolderToSetDictionary[id].Add(newFolder);
                    else
                    {
                        FolderToSetDictionary[id] = new List<Builder_Source_Folder> {newFolder};
                    }
                }

                SettingsObject.IncomingFolders.Add(newFolder);
            }
        }
        private static void Set_NonScheduled_Modules(Builder_Settings SettingsObject, DataTable BuilderFoldersTable, Dictionary<int, List<Builder_Module_Setting>> SetidToModules, bool IncludeModuleDescriptions )
        {
            //DataColumn moduleIdColumn = BuilderFoldersTable.Columns["ModuleID"];
            DataColumn assemblyColumn = BuilderFoldersTable.Columns["Assembly"];
            DataColumn classColumn = BuilderFoldersTable.Columns["Class"];
            DataColumn descColumn = BuilderFoldersTable.Columns["ModuleDesc"];
            DataColumn args1Column = BuilderFoldersTable.Columns["Argument1"];
            DataColumn args2Column = BuilderFoldersTable.Columns["Argument2"];
            DataColumn args3Column = BuilderFoldersTable.Columns["Argument3"];
               // DataColumn enabledColumn = BuilderFoldersTable.Columns["Enabled"];
            DataColumn setIdColumn = BuilderFoldersTable.Columns["ModuleSetID"];
               // DataColumn setNameColumn = BuilderFoldersTable.Columns["SetName"];
               // DataColumn setEnabledColumn = BuilderFoldersTable.Columns["SetEnabled"];
            DataColumn typeAbbrevColumn = BuilderFoldersTable.Columns["TypeAbbrev"];
               // DataColumn typeDescColumn = BuilderFoldersTable.Columns["TypeDescription"];

            int prevSetid = -1;
            List<Builder_Module_Setting> folderSettings = new List<Builder_Module_Setting>();
            foreach (DataRow thisRow in BuilderFoldersTable.Rows)
            {
                string type = thisRow[typeAbbrevColumn].ToString().ToUpper();

                Builder_Module_Setting newSetting = new Builder_Module_Setting
                {
                    Class = thisRow[classColumn].ToString()
                };
                if (thisRow[assemblyColumn] != DBNull.Value)
                    newSetting.Assembly = thisRow[assemblyColumn].ToString();
                if (thisRow[args1Column] != DBNull.Value)
                    newSetting.Argument1 = thisRow[args1Column].ToString();
                if (thisRow[args2Column] != DBNull.Value)
                    newSetting.Argument2 = thisRow[args2Column].ToString();
                if (thisRow[args3Column] != DBNull.Value)
                    newSetting.Argument3 = thisRow[args3Column].ToString();

                if (IncludeModuleDescriptions)
                {
                    if (thisRow[descColumn] != DBNull.Value)
                        newSetting.Description = thisRow[descColumn].ToString();
                }

                switch (type)
                {
                    case "PRE":
                        SettingsObject.PreProcessModulesSettings.Add(newSetting);
                        break;

                    case "POST":
                        SettingsObject.PostProcessModulesSettings.Add(newSetting);
                        break;

                    case "NEW":
                        SettingsObject.ItemProcessModulesSettings.Add(newSetting);
                        break;

                    case "DELT":
                        SettingsObject.ItemDeleteModulesSettings.Add(newSetting);
                        break;

                    case "FOLD":
                        int setId = Int32.Parse(thisRow[setIdColumn].ToString());
                        if (prevSetid != setId)
                        {
                            if (folderSettings.Count > 0)
                            {
                                SetidToModules[prevSetid] = folderSettings;
                                folderSettings = new List<Builder_Module_Setting>();
                            }
                            prevSetid = setId;
                            folderSettings.Add(newSetting);
                        }
                        else
                        {
                            folderSettings.Add(newSetting);
                        }
                        break;
                }
            }

            if (folderSettings.Count > 0)
            {
                SetidToModules[prevSetid] = folderSettings;
            }
        }
        /// <summary> Gets the builder-specific settings, including all the builder modules and incoming folders </summary>
        /// <param name="Response"></param>
        /// <param name="UrlSegments"></param>
        /// <param name="QueryString"></param>
        /// <param name="Protocol"></param>
        /// <param name="IsDebug"></param>
        public void GetBuilderSettings(HttpResponse Response, List<string> UrlSegments, NameValueCollection QueryString, Microservice_Endpoint_Protocol_Enum Protocol, bool IsDebug)
        {
            Custom_Tracer tracer = new Custom_Tracer();

            // Should descriptions be suppressed?
            bool includeDescriptions = !((!String.IsNullOrEmpty(QueryString["IncludeDescs"])) && (QueryString["IncludeDescs"].ToUpper() == "FALSE"));
            try
            {
                tracer.Add_Trace("BuilderServices.GetBuilderSettings", "Pulling dataset from the database");

                // Get the dataset with all the builder settings
                DataSet builderSet = Engine_Database.Get_Builder_Settings(true, tracer);

                // If the returned value from the database was NULL, there was an error
                if ((builderSet == null) || ( builderSet.Tables.Count == 0 ))
                {
                    Response.ContentType = "text/plain";
                    Response.Output.WriteLine("Error completing request");

                    if (IsDebug)
                    {
                        Response.Output.WriteLine("DataSet returned from the database was either NULL or empty");
                        if (Engine_Database.Last_Exception != null)
                        {
                            Response.Output.WriteLine();
                            Response.Output.WriteLine(Engine_Database.Last_Exception.Message);
                            Response.Output.WriteLine();
                            Response.Output.WriteLine(Engine_Database.Last_Exception.StackTrace);
                        }

                        Response.Output.WriteLine();
                        Response.Output.WriteLine(tracer.Text_Trace);
                    }

                    Response.StatusCode = 500;
                    return;
                }

                tracer.Add_Trace("BuilderServices.GetBuilderSettings", "Build the builder-specific settings object");
                Builder_Settings returnValue = new Builder_Settings();
                if (!Builder_Settings_Builder.Refresh(returnValue, builderSet, includeDescriptions, 0))
                {
                    Response.ContentType = "text/plain";
                    Response.Output.WriteLine("Error completing request");

                    if (IsDebug)
                    {
                        Response.Output.WriteLine("Error creating the Builder_Settings object from the database tables");
                        Response.Output.WriteLine();
                        Response.Output.WriteLine(tracer.Text_Trace);
                    }

                    Response.StatusCode = 500;
                    return;
                }

                // If this was debug mode, then just write the tracer
                if (IsDebug)
                {
                    Response.ContentType = "text/plain";
                    Response.Output.WriteLine("DEBUG MODE DETECTED");
                    Response.Output.WriteLine();
                    Response.Output.WriteLine(tracer.Text_Trace);

                    return;
                }

                // Get the JSON-P callback function
                string json_callback = "parseBuilderSettings";
                if ((Protocol == Microservice_Endpoint_Protocol_Enum.JSON_P) && (!String.IsNullOrEmpty(QueryString["callback"])))
                {
                    json_callback = QueryString["callback"];
                }

                // Use the base class to serialize the object according to request protocol
                Serialize(returnValue, Response, Protocol, json_callback);
            }
            catch (Exception ee)
            {
                if (IsDebug)
                {
                    Response.ContentType = "text/plain";
                    Response.Output.WriteLine("EXCEPTION CAUGHT!");
                    Response.Output.WriteLine();
                    Response.Output.WriteLine(ee.Message);
                    Response.Output.WriteLine();
                    Response.Output.WriteLine(ee.StackTrace);
                    Response.Output.WriteLine();
                    Response.Output.WriteLine(tracer.Text_Trace);
                    return;
                }

                Response.ContentType = "text/plain";
                Response.Output.WriteLine("Error completing request");
                Response.StatusCode = 500;
            }
        }
        /// <summary> Refresh the settings and item list from the database </summary>
        /// <returns> TRUE if successful, otherwise FALSE </returns>
        public bool Refresh_Settings_And_Item_List()
        {
            // Create the tracer for this
            Custom_Tracer tracer = new Custom_Tracer();

            // Disable the cache
            CachedDataManager.Settings.Disabled = true;

            // Set all the database strings appropriately
            Engine_Database.Connection_String = instanceInfo.DatabaseConnection.Connection_String;
            SobekCM_Item_Database.Connection_String = instanceInfo.DatabaseConnection.Connection_String;
            Library.Database.SobekCM_Database.Connection_String = instanceInfo.DatabaseConnection.Connection_String;

            // Get the settings values directly from the database
            settings = InstanceWide_Settings_Builder.Build_Settings(instanceInfo.DatabaseConnection);
            if (settings == null)
            {
                Add_Error_To_Log("Unable to pull the newest settings from the database", String.Empty, String.Empty, -1);
                return false;
            }

            // If this was not refreshed yet, ensure [BASEURL] is replaced
            if (!refreshed)
            {
                // Determine the base url
                string baseUrl = String.IsNullOrWhiteSpace(settings.Servers.Base_URL) ? settings.Servers.Application_Server_URL : settings.Servers.Base_URL;
                List<MicroservicesClient_Endpoint> endpoints = instanceInfo.Microservices.Endpoints;
                foreach (MicroservicesClient_Endpoint thisEndpoint in endpoints)
                {
                    if (thisEndpoint.URL.IndexOf("[BASEURL]") > 0)
                        thisEndpoint.URL = thisEndpoint.URL.Replace("[BASEURL]", baseUrl).Replace("//", "/").Replace("http:/", "http://").Replace("https:/", "https://");
                    else if (( thisEndpoint.URL.IndexOf("http:/") < 0 ) && ( thisEndpoint.URL.IndexOf("https:/") < 0 ))
                        thisEndpoint.URL = ( baseUrl + thisEndpoint.URL).Replace("//", "/").Replace("http:/", "http://").Replace("https:/", "https://");
                }
                refreshed = true;
            }

            // Set the microservice endpoints
            SobekEngineClient.Set_Endpoints(instanceInfo.Microservices);

            // Load the necessary configuration objects into the engine application cache gateway
            try
            {
                Engine_ApplicationCache_Gateway.Configuration.OAI_PMH = SobekEngineClient.Admin.Get_OAI_PMH_Configuration(tracer);
            }
            catch (Exception ee)
            {
                Add_Error_To_Log("Unable to pull the OAI-PMH settings from the engine", String.Empty, String.Empty, -1);
                Add_Error_To_Log(ee.Message, String.Empty, String.Empty, -1);
                return false;
            }

            try
            {
                Engine_ApplicationCache_Gateway.Configuration.Metadata = SobekEngineClient.Admin.Get_Metadata_Configuration(tracer);
            }
            catch (Exception ee)
            {
                Add_Error_To_Log("Unable to pull the metadata settings from the engine", String.Empty, String.Empty, -1);
                Add_Error_To_Log(ee.Message, String.Empty, String.Empty, -1);
                return false;
            }

            try
            {
                Engine_ApplicationCache_Gateway.Configuration.Extensions = SobekEngineClient.Admin.Get_Extensions_Configuration(tracer);
            }
            catch (Exception ee)
            {
                Add_Error_To_Log("Unable to pull the extension settings from the engine", String.Empty, String.Empty, -1);
                Add_Error_To_Log(ee.Message, String.Empty, String.Empty, -1);
                return false;
            }

            // Check for any enabled extensions with assemblies
            ResourceObjectSettings.Clear_Assemblies();
            try
            {
                if ((Engine_ApplicationCache_Gateway.Configuration.Extensions.Extensions != null) && (Engine_ApplicationCache_Gateway.Configuration.Extensions.Extensions.Count > 0))
                {
                    // Step through each extension
                    foreach (ExtensionInfo extensionInfo in Engine_ApplicationCache_Gateway.Configuration.Extensions.Extensions)
                    {
                        // If not enabled, skip it
                        if (!extensionInfo.Enabled) continue;

                        // Look for assemblies
                        if ((extensionInfo.Assemblies != null) && (extensionInfo.Assemblies.Count > 0))
                        {
                            // Step through each assembly
                            foreach (ExtensionAssembly assembly in extensionInfo.Assemblies)
                            {
                                // Find the relative file name
                                if (assembly.FilePath.IndexOf("plugins", StringComparison.OrdinalIgnoreCase) > 0)
                                {
                                    // Determine the network way to get there
                                    string from_plugins = assembly.FilePath.Substring(assembly.FilePath.IndexOf("plugins", StringComparison.OrdinalIgnoreCase));
                                    string network_plugin_file = Path.Combine(settings.Servers.Application_Server_Network, from_plugins);

                                    // Get the plugin filename
                                    string plugin_filename = Path.GetFileName(assembly.FilePath);

                                    // Does this local plugin directory exist for this extension?
                                    string local_path = Path.Combine(pluginRootDirectory, instanceInfo.Name, extensionInfo.Code);
                                    if (!Directory.Exists(local_path))
                                    {
                                        try
                                        {
                                            Directory.CreateDirectory(local_path);
                                        }
                                        catch (Exception ee)
                                        {
                                            Add_Error_To_Log("Error creating the necessary plug-in subdirectory", String.Empty, String.Empty, -1);
                                            Add_Error_To_Log(ee.Message, String.Empty, String.Empty, -1);
                                            return false;
                                        }
                                    }

                                    // Determine if the assembly is here
                                    string local_file = Path.Combine(local_path, plugin_filename);
                                    if (!File.Exists(local_file))
                                    {
                                        File.Copy(network_plugin_file, local_file);
                                    }
                                    else
                                    {
                                        // Do a date check
                                        DateTime webFileDate = File.GetLastWriteTime(network_plugin_file);
                                        DateTime localFileDate = File.GetLastWriteTime(local_file);

                                        if (webFileDate.CompareTo(localFileDate) > 0)
                                        {
                                            File.Copy(network_plugin_file, local_file, true);
                                        }
                                    }

                                    // Also, point the assembly to use the local file
                                    assembly.FilePath = local_file;
                                }
                            }
                        }
                    }

                    // Now, also set this all in the metadata portion
                    // Copy over all the extension information
                    foreach (ExtensionInfo thisExtension in Engine_ApplicationCache_Gateway.Configuration.Extensions.Extensions)
                    {
                        if ((thisExtension.Enabled) && (thisExtension.Assemblies != null))
                        {
                            foreach (ExtensionAssembly thisAssembly in thisExtension.Assemblies)
                            {
                                ResourceObjectSettings.Add_Assembly(thisAssembly.ID, thisAssembly.FilePath);
                            }
                        }
                    }
                }
            }
            catch (Exception ee)
            {
                Add_Error_To_Log("Unable to copy the extension files from the web", String.Empty, String.Empty, -1);
                Add_Error_To_Log(ee.Message, String.Empty, String.Empty, -1);
                return false;
            }

            // Finalize the metadata config
            Engine_ApplicationCache_Gateway.Configuration.Metadata.Finalize_Metadata_Configuration();

            // Set the metadata preferences for writing
            ResourceObjectSettings.MetadataConfig = Engine_ApplicationCache_Gateway.Configuration.Metadata;

            // Also, load the builder configuration this way
            try
            {
                builderSettings = SobekEngineClient.Builder.Get_Builder_Settings(false, tracer);
            }
            catch (Exception ee)
            {
                Add_Error_To_Log("Unable to pull the builder settings from the engine", String.Empty, String.Empty, -1);
                Add_Error_To_Log(ee.Message, String.Empty, String.Empty, -1);
                return false;
            }

            // Build the modules
            builderModules = new Builder_Modules(builderSettings);
            List<string> errors = builderModules.Builder_Modules_From_Settings(instanceInfo.Name);

            if (( errors != null ) && ( errors.Count > 0 ))
            {
                long logId = Add_Error_To_Log("Error(s) builder the modules from the settings", String.Empty, String.Empty, -1);
                foreach (string thisError in errors)
                {
                    Add_Error_To_Log(thisError, String.Empty, String.Empty, logId);
                }
                return false;
            }

            // Add the event listeners
            foreach (iPreProcessModule thisModule in builderModules.PreProcessModules)
            {
                thisModule.Error += module_Error;
                thisModule.Process += module_Process;
            }
            foreach (iSubmissionPackageModule thisModule in builderModules.DeleteItemModules)
            {
                thisModule.Error += module_Error;
                thisModule.Process += module_Process;
            }
            foreach (iSubmissionPackageModule thisModule in builderModules.ItemProcessModules)
            {
                thisModule.Error += module_Error;
                thisModule.Process += module_Process;
            }
            foreach (iPostProcessModule thisModule in builderModules.PostProcessModules)
            {
                thisModule.Error += module_Error;
                thisModule.Process += module_Process;
            }
            foreach (iFolderModule thisModule in builderModules.AllFolderModules)
            {
                thisModule.Error += module_Error;
                thisModule.Process += module_Process;
            }

            return true;
        }