public bool GetProvidersNodeGroup(string name, out ProvidersNodeGroup node) { if (!GetChildNode(name, out node)) { node = new ProvidersNodeGroup(); return false; } return true; }
/// <summary> /// Parses the specified <see cref="XmlElement"/> element into a /// <see cref="ProvidersNode"/> object. /// </summary> /// <param name="element"> /// A Xml element that contains the providers configuration data. /// </param> /// <param name="base_directory"> /// The base directory to use when resolving the providers's location. /// </param> /// <returns> /// A <see cref="ProvidersNode"/> containing the configured providers. /// </returns> /// <exception cref="ArgumentNullException"> /// <paramref name="element"/> is a <c>null</c> reference. /// </exception> /// <exception cref="ConfigurationException"> /// The <paramref name="element"/> contains invalid configuration data. /// </exception> public static ProvidersNode Parse(XmlElement element, string base_directory) { CheckPreconditions(element, base_directory); IList<UnresolvedOptions> unresolved_options_references = new List<UnresolvedOptions>(); List<ReplicasNode> replicas = new List<ReplicasNode>(); Dictionary<string, IProviderOptions> reference_table = new Dictionary<string, IProviderOptions>(); ProvidersNode providers = new ProvidersNode(); foreach (XmlNode node in element.ChildNodes) { if (node.NodeType == XmlNodeType.Element) { if (Strings.AreEquals(node.Name, Strings.kProviderNodeName)) { IList<string> references; IProviderNode provider = ProviderNode .Parse((XmlElement) node, base_directory, out references); IProvidersNodeGroup providers_node_group; if (!providers.GetProvidersNodeGroup(provider.Group, out providers_node_group)) { providers_node_group = new ProvidersNodeGroup(provider.Group); providers.Add(providers_node_group); } providers_node_group.Add(provider); // Associate each alias with the provider object. foreach (string alias in provider.Aliases) { providers_node_group.Add(alias, provider); } // Add the provider to the unresolved providers list if it has // references to be resolved. if (references.Count > 0) { unresolved_options_references .Add(new UnresolvedOptions(provider.Options, references)); } } else if (Strings.AreEquals(node.Name, Strings.kOptionsNodeName)) { ParseReferenceTable((XmlElement) node, unresolved_options_references, reference_table); } else if (Strings.AreEquals(node.Name, Strings.kReplicasNodeName)) { replicas.Add(ReplicasNode.Parse((XmlElement) node)); } } if (unresolved_options_references.Count > 0) { if (reference_table.Count == 0) { throw new ConfigurationException( Resources.Resources.Configuration_providers_missing_reference); } ResolveOptionsReferences(unresolved_options_references, reference_table); } if (replicas.Count > 0) { CreateReplicas(replicas, providers); } } return providers; }
public bool GetProvidersNodeGroup(string name, out ProvidersNodeGroup node) { if (!GetChildNode(name, out node)) { node = new ProvidersNodeGroup(); return(false); } return(true); }
/// <summary> /// Adds the given <see cref="IProvidersNode"/> object to a empty /// <see cref="IProvidersNodeGroup"/> inside the given /// <see cref="IProvidersNode"/> object using the given provider name. /// </summary> /// <param name="nodes"> /// A <see cref="IProvidersNode"/> object to add the <paramref name="node"/> /// </param> /// <param name="node"> /// The <see cref="IProvidersNode"/> object to be added to the /// <paramref name="nodes"/>. /// </param> /// <param name="name"> /// The name to be associated with the provider node. /// </param> public static void Add(this IProvidersNode nodes, string name, IProviderNode node) { IProvidersNodeGroup empty_provider_group; if (!nodes.GetProvidersNodeGroup(string.Empty, out empty_provider_group)) { empty_provider_group = new ProvidersNodeGroup(); nodes.Add(empty_provider_group); } empty_provider_group.Add(name, node); }
static IEnumerable <IProviderNode> Replicate(ReplicasNode replicas, ProvidersNodeGroup group) { List <ProviderNode> clones = new List <ProviderNode>(); foreach (ReplicaNode replica in replicas) { clones.AddRange(Replicate(replica, group)); } return(clones.ToArray()); }
static IEnumerable <ProviderNode> Replicate(ReplicaNode replica, ProvidersNodeGroup group) { List <ProviderNode> clones = new List <ProviderNode>(group.Count); foreach (ProviderNode provider in group) { ProviderNode clone = provider.Clone(provider.Name + replica.Name); List <string> aliases = new List <string>(); foreach (string alias in clone.Aliases) { aliases.Add(alias + replica.Name); } // replace/add the cloned options with the replica's options foreach (KeyValuePair <string, string> option in replica.Options) { clone.Options[option.Key] = option.Value; } clones.Add(clone); } return(clones); }
static void CreateReplicas(IList <ReplicasNode> replicas, ProvidersNode providers) { ProvidersNodeGroup group = null; List <IProviderNode> clones = new List <IProviderNode>(providers.Count * replicas.Count); foreach (ReplicasNode replica in replicas) { if (!providers.GetProvidersNodeGroup(replica.Group, out group)) { throw new ConfigurationException(string.Format( Resources.Resources. Configuration_providers_inexistent_replicas_group, replica.Group)); } clones.AddRange(Replicate(replica, group)); } if (group != null) { group.AddRange(clones); } }
static IEnumerable<ProviderNode> Replicate(ReplicaNode replica, ProvidersNodeGroup group) { List<ProviderNode> clones = new List<ProviderNode>(group.Count); foreach (ProviderNode provider in group) { ProviderNode clone = provider.Clone(provider.Name + replica.Name); List<string> aliases = new List<string>(); foreach (string alias in clone.Aliases) { aliases.Add(alias + replica.Name); } // replace/add the cloned options with the replica's options foreach (KeyValuePair<string, string> option in replica.Options) { clone.Options[option.Key] = option.Value; } clones.Add(clone); } return clones; }
static IEnumerable<IProviderNode> Replicate(ReplicasNode replicas, ProvidersNodeGroup group) { List<ProviderNode> clones = new List<ProviderNode>(); foreach (ReplicaNode replica in replicas) { clones.AddRange(Replicate(replica, group)); } return clones.ToArray(); }
/// <summary> /// Parses the specified <see cref="XmlElement"/> element into a /// <see cref="ProvidersNode"/> object. /// </summary> /// <param name="element"> /// A Xml element that contains the providers configuration data. /// </param> /// <param name="base_directory"> /// The base directory to use when resolving the providers's location. /// </param> /// <returns> /// A <see cref="ProvidersNode"/> containing the configured providers. /// </returns> /// <exception cref="ArgumentNullException"> /// <paramref name="element"/> is a <c>null</c> reference. /// </exception> /// <exception cref="ConfigurationException"> /// The <paramref name="element"/> contains invalid configuration data. /// </exception> public static ProvidersNode Parse(XmlElement element, string base_directory) { CheckPreconditions(element, base_directory); IList <UnresolvedOptions> unresolved_options_references = new List <UnresolvedOptions>(); List <ReplicasNode> replicas = new List <ReplicasNode>(); Dictionary <string, IProviderOptions> reference_table = new Dictionary <string, IProviderOptions>(); ProvidersNode providers = new ProvidersNode(); foreach (XmlNode node in element.ChildNodes) { if (node.NodeType == XmlNodeType.Element) { if (Strings.AreEquals(node.Name, Strings.kProviderNodeName)) { IList <string> references; IProviderNode provider = ProviderNode .Parse((XmlElement)node, base_directory, out references); IProvidersNodeGroup providers_node_group; if (!providers.GetProvidersNodeGroup(provider.Group, out providers_node_group)) { providers_node_group = new ProvidersNodeGroup(provider.Group); providers.Add(providers_node_group); } providers_node_group.Add(provider); // Associate each alias with the provider object. foreach (string alias in provider.Aliases) { providers_node_group.Add(alias, provider); } // Add the provider to the unresolved providers list if it has // references to be resolved. if (references.Count > 0) { unresolved_options_references .Add(new UnresolvedOptions(provider.Options, references)); } } else if (Strings.AreEquals(node.Name, Strings.kOptionsNodeName)) { ParseReferenceTable((XmlElement)node, unresolved_options_references, reference_table); } else if (Strings.AreEquals(node.Name, Strings.kReplicasNodeName)) { replicas.Add(ReplicasNode.Parse((XmlElement)node)); } } if (unresolved_options_references.Count > 0) { if (reference_table.Count == 0) { throw new ConfigurationException( Resources.Resources.Configuration_providers_missing_reference); } ResolveOptionsReferences(unresolved_options_references, reference_table); } if (replicas.Count > 0) { CreateReplicas(replicas, providers); } } return(providers); }