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; }
/// <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); }