File: System\ServiceModel\Discovery\Configuration\ServiceDiscoveryElement.cs
Project: ndp\cdf\src\NetFx40\System.ServiceModel.Discovery\System.ServiceModel.Discovery.csproj (System.ServiceModel.Discovery)
//----------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//----------------------------------------------------------------
 
namespace System.ServiceModel.Discovery.Configuration
{
    using System.Configuration;
    using System.Diagnostics.CodeAnalysis;
    using System.Runtime;
    using System.ServiceModel.Configuration;
    using System.ServiceModel.Description;
    using SR2 = System.ServiceModel.Discovery.SR;
 
    public sealed class ServiceDiscoveryElement : BehaviorExtensionElement
    {
        ConfigurationPropertyCollection properties;
 
        public ServiceDiscoveryElement()
        {
        }
 
        [ConfigurationProperty(ConfigurationStrings.AnnouncementEndpoints)]
        public AnnouncementChannelEndpointElementCollection AnnouncementEndpoints
        {
            get
            {
                return (AnnouncementChannelEndpointElementCollection)base[ConfigurationStrings.AnnouncementEndpoints];
            }
        }
 
        [SuppressMessage(FxCop.Category.Configuration, FxCop.Rule.ConfigurationPropertyAttributeRule,
            Justification = "This property is defined by the base class to determine the type of the behavior.")]
        public override Type BehaviorType
        {
            get
            {
                return typeof(ServiceDiscoveryBehavior);
            }
        }
 
        protected override ConfigurationPropertyCollection Properties
        {
            get
            {
                if (this.properties == null)
                {
                    ConfigurationPropertyCollection properties = new ConfigurationPropertyCollection();
 
                    properties.Add(
                        new ConfigurationProperty(
                        ConfigurationStrings.AnnouncementEndpoints,
                        typeof(AnnouncementChannelEndpointElementCollection), 
                        null, 
                        null, 
                        null, 
                        ConfigurationPropertyOptions.None));
 
                    this.properties = properties;
                }
                return this.properties;
            }
        }
 
        protected internal override object CreateBehavior()
        {
            ServiceDiscoveryBehavior serviceDiscoveryBehavior = new ServiceDiscoveryBehavior();
 
            AnnouncementEndpoint announcementEndpoint;
            foreach (ChannelEndpointElement channelEndpointElement in this.AnnouncementEndpoints)
            {
                if (string.IsNullOrEmpty(channelEndpointElement.Kind))
                {
                    throw FxTrace.Exception.AsError(
                        new ConfigurationErrorsException(
                        SR2.DiscoveryConfigAnnouncementEndpointMissingKind(
                        typeof(AnnouncementEndpoint).FullName)));
                }
 
                ServiceEndpoint serviceEndpoint = ConfigLoader.LookupEndpoint(channelEndpointElement, null);
                if (serviceEndpoint == null)
                {
                    throw FxTrace.Exception.AsError(
                        new ConfigurationErrorsException(
                        SR2.DiscoveryConfigInvalidEndpointConfiguration(
                        channelEndpointElement.Kind)));
                }
 
                announcementEndpoint = serviceEndpoint as AnnouncementEndpoint;
                if (announcementEndpoint == null)
                {
                    throw FxTrace.Exception.AsError(
                        new InvalidOperationException(
                        SR2.DiscoveryConfigInvalidAnnouncementEndpoint(
                        channelEndpointElement.Kind,
                        serviceEndpoint.GetType().FullName,
                        typeof(AnnouncementEndpoint).FullName)));
                }
 
                serviceDiscoveryBehavior.AnnouncementEndpoints.Add(announcementEndpoint);
            }
 
            return serviceDiscoveryBehavior;
        }
    }
}