Metadata configuration for all the classes used to read/write metadata files or sections within a METS file
        /// <summary> Constructor for a new instance of the InstanceWide_Configuration class </summary>
        public InstanceWide_Configuration()
        {
            // Create some of the configuration stuff
            Authentication = new Authentication_Configuration();
            BriefItemMapping = new BriefItemMapping_Configuration();
            ContactForm = new ContactForm_Configuration();
            Engine = new Engine_Server_Configuration();
            Extensions = new Extension_Configuration();
            QualityControlTool = new QualityControl_Configuration();
            Metadata = new Metadata_Configuration();
            OAI_PMH = new OAI_PMH_Configuration();
            UI = new InstanceWide_UI_Configuration();
            Source = new Configuration_Source_Info();

            // Set some defaults
            HasData = false;
        }
        private static void read_mets_writing_config(XmlReader ReaderXml, Dictionary<string, METS_Section_ReaderWriter_Config> ReaderWriters, Metadata_Configuration Config )
        {
            bool inPackage = false;
            bool inDivision = false;
            bool inFile = false;
            bool inDmdSec = true;
            METS_Writing_Profile profile = null;
            int unnamed_profile_counter = 1;

            while (ReaderXml.Read())
            {
                if (ReaderXml.NodeType == XmlNodeType.Element)
                {
                    switch (ReaderXml.Name.ToLower())
                    {
                        case "profile":
                            profile = new METS_Writing_Profile();
                            if (ReaderXml.MoveToAttribute("name"))
                                profile.Profile_Name = ReaderXml.Value.Trim();
                            if (ReaderXml.MoveToAttribute("description"))
                                profile.Profile_Description = ReaderXml.Value;
                            if (ReaderXml.MoveToAttribute("isDefault"))
                            {
                                bool tempValue;
                                if (bool.TryParse(ReaderXml.Value, out tempValue))
                                {
                                    profile.Default_Profile = tempValue;
                                }
                            }
                            // Enforce a name for this profile (should have one according to XSD)
                            if (profile.Profile_Name.Length == 0)
                            {
                                profile.Profile_Name = "Unnamed" + unnamed_profile_counter;
                                unnamed_profile_counter++;
                            }
                            // Does this profile already exist?
                            METS_Writing_Profile existingProfile = Config.Get_Writing_Profile(profile.Profile_Name);
                            if (existingProfile != null)
                            {
                                profile = existingProfile;

                            }
                            else
                            {
                                Config.Add_METS_Writing_Profile(profile);
                            }

                            break;

                        case "package_scope":
                            inPackage = true;
                            inDivision = false;
                            inFile = false;
                            break;

                        case "division_scope":
                            inPackage = false;
                            inDivision = true;
                            inFile = false;
                            break;

                        case "file_scope":
                            inPackage = false;
                            inDivision = false;
                            inFile = true;
                            break;

                        case "dmdsec":
                            inDmdSec = true;
                            break;

                        case "amdsec":
                            inDmdSec = false;
                            break;

                        case "readerwriterref":
                            if (ReaderXml.MoveToAttribute("ID"))
                            {
                                string id = ReaderXml.Value.ToUpper();
                                if ((ReaderWriters.ContainsKey(id)) && (profile != null))
                                {
                                    METS_Section_ReaderWriter_Config readerWriter = ReaderWriters[id];
                                    if (inPackage)
                                    {
                                        if (inDmdSec)
                                            profile.Add_Package_Level_DmdSec_Writer_Config(readerWriter);
                                        else
                                            profile.Add_Package_Level_AmdSec_Writer_Config(readerWriter);
                                    }
                                    else if (inDivision)
                                    {
                                        if (inDmdSec)
                                            profile.Add_Division_Level_DmdSec_Writer_Config(readerWriter);
                                        else
                                            profile.Add_Division_Level_AmdSec_Writer_Config(readerWriter);
                                    }
                                    else if (inFile)
                                    {
                                        if (inDmdSec)
                                            profile.Add_File_Level_DmdSec_Writer_Config(readerWriter);
                                        else
                                            profile.Add_File_Level_AmdSec_Writer_Config(readerWriter);
                                    }
                                }
                            }
                            break;
                    }
                }
            }
        }
 private static void read_mets_readerwriter_configs(XmlReader ReaderXml, Dictionary<string, METS_Section_ReaderWriter_Config> ReaderWriters, Metadata_Configuration Config )
 {
     while (ReaderXml.Read())
     {
         if (ReaderXml.NodeType == XmlNodeType.Element)
         {
             if (ReaderXml.Name.ToLower() == "readerwriter")
             {
                 METS_Section_ReaderWriter_Config singleReaderWriter = read_mets_section_readerwriter_config(ReaderXml.ReadSubtree());
                 ReaderWriters.Add(singleReaderWriter.ID.ToUpper(), singleReaderWriter);
                 Config.Add_METS_Section_ReaderWriter(singleReaderWriter);
             }
         }
     }
 }
        private static void read_metadata_modules_config(XmlReader ReaderXml, Metadata_Configuration Config )
        {
            while (ReaderXml.Read())
            {
                if ((ReaderXml.NodeType == XmlNodeType.Element) && (ReaderXml.Name.ToLower() == "metadatamodule"))
                {
                    // read all the values
                    Additional_Metadata_Module_Config module = new Additional_Metadata_Module_Config();
                    if (ReaderXml.MoveToAttribute("key"))
                        module.Key = ReaderXml.Value.Trim();
                    if (ReaderXml.MoveToAttribute("assembly"))
                        module.Code_Assembly = ReaderXml.Value;
                    if (ReaderXml.MoveToAttribute("namespace"))
                        module.Code_Namespace = ReaderXml.Value;
                    if (ReaderXml.MoveToAttribute("class"))
                        module.Code_Class = ReaderXml.Value;

                    // Only add if valid
                    if ((module.Key.Length > 0) && (module.Code_Class.Length > 0) && (module.Code_Namespace.Length > 0))
                    {
                        Config.Add_Metadata_Module_Config(module);
                    }
                }
            }
        }
        private static void read_metadata_file_readerwriter_configs(XmlReader ReaderXml, Metadata_Configuration Config)
        {
            while (ReaderXml.Read())
            {
                if (ReaderXml.NodeType == XmlNodeType.Element)
                {
                    if (ReaderXml.Name.ToLower() == "clear")
                        Config.Clear_Metadata_File_ReaderWriter_Config();

                    if (ReaderXml.Name.ToLower() == "readerwriter")
                        read_metadata_file_readerwriter_config(ReaderXml.ReadSubtree(), Config );
                }
            }
        }
        private static void read_metadata_file_readerwriter_config(XmlReader ReaderXml, Metadata_Configuration Config )
        {
            Metadata_File_ReaderWriter_Config returnValue = new Metadata_File_ReaderWriter_Config();
            ReaderXml.Read();

            // Move to and save the basic attributes
            if (ReaderXml.MoveToAttribute("mdtype"))
            {
                switch (ReaderXml.Value.ToUpper())
                {
                    case "EAD":
                        returnValue.MD_Type = Metadata_File_Type_Enum.EAD;
                        break;

                    case "DC":
                        returnValue.MD_Type = Metadata_File_Type_Enum.DC;
                        break;

                    case "MARC21":
                        returnValue.MD_Type = Metadata_File_Type_Enum.MARC21;
                        break;

                    case "MARCXML":
                        returnValue.MD_Type = Metadata_File_Type_Enum.MARCXML;
                        break;

                    case "METS":
                        returnValue.MD_Type = Metadata_File_Type_Enum.METS;
                        break;

                    case "MODS":
                        returnValue.MD_Type = Metadata_File_Type_Enum.MODS;
                        break;

                    case "OTHER":
                        returnValue.MD_Type = Metadata_File_Type_Enum.OTHER;
                        if (ReaderXml.MoveToAttribute("othermdtype"))
                            returnValue.Other_MD_Type = ReaderXml.Value;
                        break;
                }
            }

            if (ReaderXml.MoveToAttribute("label"))
                returnValue.Label = ReaderXml.Value;
            if (ReaderXml.MoveToAttribute("namespace"))
                returnValue.Code_Namespace = ReaderXml.Value;
            if (ReaderXml.MoveToAttribute("class"))
                returnValue.Code_Class = ReaderXml.Value;
            if (ReaderXml.MoveToAttribute("assembly"))
                returnValue.Code_Assembly = ReaderXml.Value;
            if ((ReaderXml.MoveToAttribute("canRead")) && (ReaderXml.Value.ToLower() == "false"))
            {
                returnValue.canRead = false;
            }
            if ((ReaderXml.MoveToAttribute("canWrite")) && (ReaderXml.Value.ToLower() == "false"))
            {
                returnValue.canWrite = false;
            }

            while (ReaderXml.Read())
            {
                if ((ReaderXml.NodeType == XmlNodeType.Element) && (ReaderXml.Name.ToLower() == "option"))
                {
                    string key = String.Empty;
                    string value = String.Empty;
                    if (ReaderXml.MoveToAttribute("key"))
                        key = ReaderXml.Value;
                    if (ReaderXml.MoveToAttribute("value"))
                        value = ReaderXml.Value;
                    if ((key.Length > 0) && (value.Length > 0))
                        returnValue.Add_Option(key, value);
                }
            }

            Config.Add_Metadata_File_ReaderWriter(returnValue);
        }
 /// <summary> Constructor for a new instance of the ResourceObjectSettings class </summary>
 static ResourceObjectSettings()
 {
     MetadataConfig = new Metadata_Configuration();
 }