예제 #1
0
        protected void LoadChildren()
        {
            if (_childrenLoaded)
            {
                return;
            }
            ILogger        logger        = ServiceRegistration.Get <ILogger>();
            IPluginManager pluginManager = ServiceRegistration.Get <IPluginManager>();
            string         itemLocation  = Constants.PLUGINTREE_BASELOCATION + Location;

            // We'll use a FixedItemStateTracker in the hope that the configuration will be disposed
            // after usage. The alternative would be to use a plugin item state tracker which is able to
            // remove a config element usage. But this would mean to also expose a listener registration
            // to the outside. I think this is not worth the labor.
            _childPluginItemStateTracker = new FixedItemStateTracker(string.Format("ConfigurationManager: ConfigurationNode '{0}'", itemLocation));
            ICollection <PluginItemMetadata> items    = pluginManager.GetAllPluginItemMetadata(itemLocation);
            IDictionary <string, object>     childSet = new Dictionary <string, object>();

            foreach (PluginItemMetadata itemMetadata in items)
            {
                try
                {
                    ConfigBaseMetadata metadata = pluginManager.RequestPluginItem <ConfigBaseMetadata>(itemMetadata.RegistrationLocation, itemMetadata.Id, _childPluginItemStateTracker);
                    ConfigBase         childObj = Instantiate(metadata, itemMetadata.PluginRuntime);
                    if (childObj == null)
                    {
                        continue;
                    }
                    AddChildNode(childObj);
                    childSet.Add(metadata.Id, null);
                }
                catch (PluginInvalidStateException e)
                {
                    logger.Warn("Cannot add configuration node for {0}", e, itemMetadata);
                }
            }
            ICollection <string> childLocations = pluginManager.GetAvailableChildLocations(itemLocation);

            foreach (string childLocation in childLocations)
            {
                string childId = RegistryHelper.GetLastPathSegment(childLocation);
                if (childSet.ContainsKey(childId))
                {
                    continue;
                }
                logger.Warn("Configuration: Configuration section '{0}' was found in the tree but not explicitly registered as section (config items in this section are registered by those plugins: {1})",
                            childLocation, StringUtils.Join(", ", FindPluginRegistrations(childLocation)));
                ConfigSectionMetadata dummyMetadata = new ConfigSectionMetadata(childLocation, Constants.INVALID_SECTION_TEXT, null, null);
                ConfigSection         dummySection  = new ConfigSection();
                dummySection.SetMetadata(dummyMetadata);
                AddChildNode(dummySection);
            }
            _childrenLoaded = true;
        }
예제 #2
0
        /// <summary>
        /// Helper method to create a meaningful log message. See usage.
        /// </summary>
        /// <param name="location">Parent location to search all child locations where plugins registering
        /// items to.</param>
        /// <returns>List of plugin names registering items under the specified
        /// <paramref name="location"/>.</returns>
        private static ICollection <string> FindPluginRegistrations(string location)
        {
            IPluginManager pluginManager = ServiceRegistration.Get <IPluginManager>();
            ICollection <PluginItemMetadata> itemRegistrations = pluginManager.GetAllPluginItemMetadata(location);
            List <string> result = new List <string>();

            foreach (PluginItemMetadata itemRegistration in itemRegistrations)
            {
                result.Add(itemRegistration.PluginRuntime.Metadata.Name);
            }
            foreach (string childLocation in pluginManager.GetAvailableChildLocations(location))
            {
                result.AddRange(FindPluginRegistrations(childLocation));
            }
            return(result);
        }