File: System\ServiceModel\Discovery\Configuration\DynamicEndpointElement.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;
    using System.Configuration;
    using System.Diagnostics.CodeAnalysis;
    using System.Runtime;
    using System.ServiceModel.Channels;
    using System.ServiceModel.Configuration;
    using System.ServiceModel.Description;
    using System.Xml;      
 
    [Fx.Tag.XamlVisible(false)]
    public sealed class DynamicEndpointElement : StandardEndpointElement
    {
        ConfigurationPropertyCollection properties;
 
        [ConfigurationProperty(ConfigurationStrings.DiscoveryClientSettings)]
        [SuppressMessage(FxCop.Category.Configuration, FxCop.Rule.ConfigurationValidatorAttributeRule, Justification = "No validator requiered.")]        
        public DiscoveryClientSettingsElement DiscoveryClientSettings
        {
            get
            {
                return (DiscoveryClientSettingsElement)base[ConfigurationStrings.DiscoveryClientSettings];
            }
        }
 
        protected internal override Type EndpointType
        {
            get { return typeof(DynamicEndpoint); }
        }
 
        protected override ConfigurationPropertyCollection Properties
        {
            get
            {
                if (this.properties == null)
                {
                    ConfigurationPropertyCollection properties = base.Properties;
                    
                    properties.Add(
                        new ConfigurationProperty(
                        ConfigurationStrings.DiscoveryClientSettings,
                        typeof(DiscoveryClientSettingsElement),
                        null,
                        null,
                        null,
                        ConfigurationPropertyOptions.None));                  
 
                    this.properties = properties;
                }
 
                return this.properties;
            }
        }
 
        protected internal override ServiceEndpoint CreateServiceEndpoint(ContractDescription contractDescription)
        {
            return new DynamicEndpoint(contractDescription);
        }
 
        protected override void OnInitializeAndValidate(ChannelEndpointElement channelEndpointElement)
        {
            if (string.IsNullOrEmpty(channelEndpointElement.Contract))
            {
                throw FxTrace.Exception.AsError(
                    new ConfigurationErrorsException(
                        SR.DiscoveryConfigContractNotSpecified(channelEndpointElement.Kind)));
            }
 
            if (channelEndpointElement.Address != null && !channelEndpointElement.Address.Equals(DiscoveryClientBindingElement.DiscoveryEndpointAddress.Uri))
            {
                throw FxTrace.Exception.AsError(
                    new ConfigurationErrorsException(
                            SR.DiscoveryEndpointAddressIncorrect(
                            "address",
                            channelEndpointElement.Address, 
                            DiscoveryClientBindingElement.DiscoveryEndpointAddress.Uri)));
            }
        }
 
        protected override void OnInitializeAndValidate(ServiceEndpointElement serviceEndpointElement)
        {            
            throw FxTrace.Exception.AsError(
                new InvalidOperationException(
                    SR.DiscoveryConfigDynamicEndpointInService(serviceEndpointElement.Kind)));
        }
 
        protected override void OnApplyConfiguration(ServiceEndpoint endpoint, ServiceEndpointElement serviceEndpointElement)
        {                        
        }
 
        protected override void OnApplyConfiguration(ServiceEndpoint endpoint, ChannelEndpointElement serviceEndpointElement)
        {
            DynamicEndpoint dynamicEndpoint = (DynamicEndpoint)endpoint;            
            
            if (!dynamicEndpoint.ValidateAndInsertDiscoveryClientBindingElement(dynamicEndpoint.Binding))
            {
                throw FxTrace.Exception.AsError(new ConfigurationErrorsException(SR.DiscoveryClientBindingElementPresentInDynamicEndpoint));
            }            
 
            if (PropertyValueOrigin.Default == this.DiscoveryClientSettings.ElementInformation.Properties[ConfigurationStrings.Endpoint].ValueOrigin)
            {
                dynamicEndpoint.DiscoveryEndpointProvider = new ConfigurationDiscoveryEndpointProvider();
            }
            else
            {                
                dynamicEndpoint.DiscoveryEndpointProvider = new ConfigurationDiscoveryEndpointProvider(this.DiscoveryClientSettings.DiscoveryEndpoint);
            }
 
            this.DiscoveryClientSettings.FindCriteria.ApplyConfiguration(dynamicEndpoint.FindCriteria);
 
            if (dynamicEndpoint.FindCriteria.ContractTypeNames.Count == 0)
            {
                dynamicEndpoint.FindCriteria.ContractTypeNames.Add(
                    new XmlQualifiedName(dynamicEndpoint.Contract.Name, dynamicEndpoint.Contract.Namespace));                
            }
        }
    }
}