//---------------------------------------------------------------------
        private void LoadOverrideInfo(ManagementPackOverride mpOverride)
        {
            try
            {
                ManagementPack      mp;
                ManagementPackClass mpClass;

                if (mpOverride is ManagementPackMonitorOverride)
                {
                    ManagementPackMonitorOverride monitorOverride = (ManagementPackMonitorOverride)mpOverride;
                    ManagementPackMonitor         monitor;

                    if (!m_monitorsCache.ContainsKey(monitorOverride.Monitor.Id))
                    {
                        return;
                    }

                    monitor = m_monitorsCache[monitorOverride.Monitor.Id];

                    //The class to which the monitor is targeted
                    mpClass = m_typesCache[monitor.Target.Id];

                    //The MP in which the monitor is defined
                    mp = monitor.GetManagementPack();

                    if (!m_managementPackCollection.ContainsKey(mp.Id))
                    {
                        m_managementPackCollection.Add(mp.Id, new MP(mp));
                    }

                    m_managementPackCollection[mp.Id].AddOverride(mpClass, monitor, monitorOverride);
                }
                else if (mpOverride is ManagementPackRuleOverride)
                {
                    ManagementPackRuleOverride ruleOverride = (ManagementPackRuleOverride)mpOverride;
                    ManagementPackRule         rule;

                    if (!m_rulesCache.ContainsKey(ruleOverride.Rule.Id))
                    {
                        return;
                    }

                    rule = m_rulesCache[ruleOverride.Rule.Id];

                    //The class to which the rule is targeted
                    mpClass = m_typesCache[rule.Target.Id];

                    //The MP in which the monitor is defined
                    mp = rule.GetManagementPack();

                    if (!m_managementPackCollection.ContainsKey(mp.Id))
                    {
                        m_managementPackCollection.Add(mp.Id, new MP(mp));
                    }

                    m_managementPackCollection[mp.Id].AddOverride(mpClass, rule, ruleOverride);
                }
                else if (mpOverride is ManagementPackDiscoveryOverride)
                {
                    ManagementPackDiscoveryOverride discoveryOverride = (ManagementPackDiscoveryOverride)mpOverride;
                    ManagementPackDiscovery         discovery         = discoveryOverride.Discovery.GetElement();

                    mpClass = m_typesCache[discovery.Target.Id];

                    mp = discovery.GetManagementPack();

                    if (!m_managementPackCollection.ContainsKey(mp.Id))
                    {
                        m_managementPackCollection.Add(mp.Id, new MP(mp));
                    }

                    m_managementPackCollection[mp.Id].AddOverride(mpClass, discovery, discoveryOverride);
                }
            }
            catch (Microsoft.EnterpriseManagement.Common.ObjectNotFoundException error)
            {
                //This exception will be thrown for rules/monitors/discoveries/diagnostics/recoveries that are marked "hidden"
            }
        }
        public static void CreateQueue(string strDisplayName, string strName, string strCriteria, ManagementPackClass mpc, ref ManagementPack mp, EnterpriseManagementGroup emg)
        {
            ManagementPack mpClass    = mpc.GetManagementPack();
            string         strMPAlias = MakeMPElementSafeName(mpClass.Name);

            AddManagementPackReference(strMPAlias, mpClass.Name, ref mp, emg);

            ManagementPackClass classWorkItemGroup = GetClassByName("System.WorkItemGroup", emg);
            ManagementPackClass mpcQueue           = new ManagementPackClass(mp, strName, ManagementPackAccessibility.Public);

            mpcQueue.Abstract    = false;
            mpcQueue.Base        = classWorkItemGroup;
            mpcQueue.DisplayName = strDisplayName;
            mpcQueue.Hosted      = false;
            mpcQueue.Extension   = false;
            mpcQueue.Singleton   = true;
            mpcQueue.Status      = ManagementPackElementStatus.PendingAdd;

            ManagementPackRelationship         mprWorkItemGroupContainsWorkItem = GetRelationshipByName("System.WorkItemGroupContainsWorkItems", emg);
            ManagementPackRelationshipEndpoint mpreSource = new ManagementPackRelationshipEndpoint(mpcQueue, "ContainedByGroup");
            ManagementPackRelationshipEndpoint mpreTarget = new ManagementPackRelationshipEndpoint(mpcQueue, "GroupContains");

            mpreSource.Type = mpcQueue;
            mpreTarget.Type = mp.ProcessElementReference <ManagementPackClass>(String.Format("$MPElement[Name=\"{0}!{1}\"]$", strMPAlias, mpc.Name));

            ManagementPackRelationship mprQueueWorkItem = new ManagementPackRelationship(mp, String.Format("{0}.Relationship", strName), ManagementPackAccessibility.Public);

            mprQueueWorkItem.DisplayName = String.Format("{0} Contains {1}", strDisplayName, mpc.DisplayName);
            mprQueueWorkItem.Abstract    = false;
            mprQueueWorkItem.Base        = mprWorkItemGroupContainsWorkItem;
            mprQueueWorkItem.Source      = mpreSource;
            mprQueueWorkItem.Target      = mpreTarget;
            mprQueueWorkItem.Status      = ManagementPackElementStatus.PendingAdd;

            ManagementPackDiscoveryRelationship mpdrQueueWorkItem = new ManagementPackDiscoveryRelationship();

            mpdrQueueWorkItem.TypeID = mprQueueWorkItem;

            ManagementPack mpSystemCenter = GetManagementPackByName("Microsoft.SystemCenter.Library", emg);
            string         strSystemCenterLibraryMPAlias = MakeMPElementSafeName(mpSystemCenter.Name);

            AddManagementPackReference(strSystemCenterLibraryMPAlias, mpSystemCenter.Name, ref mp, emg);

            ManagementPackModuleType mpmtGroupPopulator = emg.Monitoring.GetModuleType("Microsoft.SystemCenter.GroupPopulator", mpSystemCenter);

            ManagementPackDiscovery mpdQueueWorkItem = new ManagementPackDiscovery(mp, MakeMPElementSafeName(String.Format("WorkITemGroup.{0}.Discovery.{1}", mpcQueue.Name, Guid.NewGuid().ToString())));

            ManagementPackDataSourceModule mpdsmPopulator = new ManagementPackDataSourceModule(mpdQueueWorkItem, MakeMPElementSafeName(Guid.NewGuid().ToString()));
            ManagementPackElementReference <ManagementPackDataSourceModuleType> mperGroupPopulator = mp.ProcessElementReference <ManagementPackDataSourceModuleType>(String.Format("$MPElement[Name=\"{0}!{1}\"]$", strSystemCenterLibraryMPAlias, mpmtGroupPopulator.Name));

            mpdsmPopulator.TypeID = mperGroupPopulator;

            StringBuilder sb = new StringBuilder();

            sb.Append("<RuleId>$MPElement$</RuleId>\r\n");
            sb.Append(String.Format("<GroupInstanceId>$MPElement[Name=\"{0}\"]$</GroupInstanceId>\r\n", strName));
            sb.Append("<MembershipRules>\r\n");
            sb.Append("<MembershipRule>\r\n");
            sb.Append(String.Format("<MonitoringClass>$MPElement[Name=\"{0}!{1}\"]$</MonitoringClass>\r\n", strMPAlias, mpc.Name));
            sb.Append(String.Format("<RelationshipClass>$MPElement[Name=\"{0}\"]$</RelationshipClass>\r\n", mprQueueWorkItem.Name));
            sb.Append(strCriteria);
            sb.Append("</MembershipRule>\r\n");
            sb.Append("</MembershipRules>\r\n");

            mpdsmPopulator.Configuration = sb.ToString();

            mpdQueueWorkItem.Enabled         = ManagementPackMonitoringLevel.@true;
            mpdQueueWorkItem.Target          = mpcQueue;
            mpdQueueWorkItem.ConfirmDelivery = false;
            mpdQueueWorkItem.Remotable       = true;
            mpdQueueWorkItem.Priority        = ManagementPackWorkflowPriority.Normal;
            mpdQueueWorkItem.Category        = ManagementPackCategoryType.Discovery;
            mpdQueueWorkItem.DiscoveryRelationshipCollection.Add(mpdrQueueWorkItem);
            mpdQueueWorkItem.DataSource = mpdsmPopulator;

            mp.AcceptChanges();
        }