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