/// <summary>
    /// Parses the specified <see cref="XmlElement"/> element into a
    /// <see cref="ProviderNode"/> object.
    /// </summary>
    /// <param name="element">
    /// A Xml element that contains the provider configuration data.
    /// </param>
    /// <param name="base_directory">
    /// The base directory to use when resolving the providers's location.
    /// </param>
    /// <returns>
    /// A <see cref="ProviderNode"/> containing the configured provider.
    /// </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 ProviderNode Parse(XmlElement element, string base_directory,
      out IList<string> options_refs) {
      CheckPreconditions(element, base_directory);
      string name = GetAttributeValue(element, Strings.kNameAttribute);
      string type = GetAttributeValue(element, Strings.kTypeAttribute);
      string location = GetLocation(element, base_directory);
      string group = GetAttributeValue(element, Strings.kGroupAttribute,
        string.Empty);

      ProviderNode provider = new ProviderNode(name, type);
      provider.location_ = location;
      provider.group_ = group;
      provider.options_ = GetOptions(name + ".Options", element, out options_refs);
      provider.aliases_ = GetAliases(element);
      return provider;
    }
示例#2
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);
        }
 public void SetUp() {
   node_ = new ProviderNode.Builder("provider",
     typeof (TestFactory).AssemblyQualifiedName)
     .Build();
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="Builder"/> class by
 /// using the provider name and type.
 /// </summary>
 /// <param name="name">
 /// A string that uniquely identifies the provider within an application.
 /// </param>
 /// <param name="type">
 /// The provider's fully qualified assembly name.
 /// </param>
 public Builder(string name, string type) {
   if (name == null || type == null) {
     throw new ArgumentNullException(type == null ? "type" : "location");
   }
   node_ = new ProviderNode(name, type);
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="Builder"/> class by
 /// using the provider name and type.
 /// </summary>
 /// <param name="name">
 /// A string that uniquely identifies the provider within an application.
 /// </param>
 /// <param name="type">
 /// The provider's fully qualified assembly name.
 /// </param>
 public Builder(string name, Type type) {
   if (name == null || type == null) {
     throw new ArgumentNullException(type == null ? "type" : "location");
   }
   node_ = new ProviderNode(name, type.AssemblyQualifiedName);
 }
 /// <summary>
 /// Builds a new <see cref="ProviderNode"/>
 /// </summary>
 /// <returns></returns>
 public ProviderNode Build() {
   ProviderNode node = new ProviderNode(node_.name, node_.type_,
     node_.location_);
   node.options_ = node_.options_;
   node.group_ = node_.group_;
   return node;
 }
示例#7
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);
        }