예제 #1
0
 public bool GetProvidersNodeGroup(string name, out ProvidersNodeGroup node) {
   if (!GetChildNode(name, out node)) {
     node = new ProvidersNodeGroup();
     return false;
   }
   return true;
 }
예제 #2
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;
    }
예제 #3
0
 public bool GetProvidersNodeGroup(string name, out ProvidersNodeGroup node)
 {
     if (!GetChildNode(name, out node))
     {
         node = new ProvidersNodeGroup();
         return(false);
     }
     return(true);
 }
예제 #4
0
 /// <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);
 }
예제 #5
0
        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());
        }
예제 #6
0
        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);
        }
예제 #7
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);
            }
        }
예제 #8
0
    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;
    }
예제 #9
0
 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();
 }
예제 #10
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);
        }