예제 #1
0
    /// <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;
    }
예제 #2
0
        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);
            }
        }
예제 #3
0
    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);
      }
    }
예제 #4
0
        /// <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);
        }