File: System\ServiceModel\Description\MetadataExporter.cs
Project: ndp\cdf\src\WCF\ServiceModel\System.ServiceModel.csproj (System.ServiceModel)
//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
 
namespace System.ServiceModel.Description
{
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Runtime;
    using System.ServiceModel.Channels;
 
    //For export we provide a builder that allows the gradual construction of a set of MetadataDocuments
    public abstract class MetadataExporter
    {
        PolicyVersion policyVersion = PolicyVersion.Policy12;
        readonly Collection<MetadataConversionError> errors = new Collection<MetadataConversionError>();
        readonly Dictionary<object, object> state = new Dictionary<object, object>();
 
        //prevent inheritance until we are ready to allow it.
        internal MetadataExporter()
        {
        }
 
        public PolicyVersion PolicyVersion
        {
            get
            {
                return this.policyVersion;
            }
            set
            {
                if (value == null)
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("value");
                this.policyVersion = value;
            }
        }
 
        public Collection<MetadataConversionError> Errors
        {
            get { return this.errors; }
        }
        public Dictionary<object, object> State
        {
            get { return this.state; }
        }
 
        public abstract void ExportContract(ContractDescription contract);
        public abstract void ExportEndpoint(ServiceEndpoint endpoint);
 
        public abstract MetadataSet GetGeneratedMetadata();
 
        internal PolicyConversionContext ExportPolicy(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
            PolicyConversionContext policyContext = new ExportedPolicyConversionContext(endpoint, bindingParameters);
 
            foreach (IPolicyExportExtension exporter in endpoint.Binding.CreateBindingElements().FindAll<IPolicyExportExtension>())
                try
                {
                    exporter.ExportPolicy(this, policyContext);
                }
#pragma warning suppress 56500 // covered by FxCOP
                catch (Exception e)
                {
                    if (Fx.IsFatal(e))
                        throw;
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(CreateExtensionException(exporter, e));
                }
 
            return policyContext;
        }
 
        protected internal PolicyConversionContext ExportPolicy(ServiceEndpoint endpoint)
        {
            return this.ExportPolicy(endpoint, null);
        }
 
        sealed class ExportedPolicyConversionContext : PolicyConversionContext
        {
            readonly BindingElementCollection bindingElements;
            PolicyAssertionCollection bindingAssertions;
            Dictionary<OperationDescription, PolicyAssertionCollection> operationBindingAssertions;
            Dictionary<MessageDescription, PolicyAssertionCollection> messageBindingAssertions;
            Dictionary<FaultDescription, PolicyAssertionCollection> faultBindingAssertions;
            BindingParameterCollection bindingParameters;
 
            internal ExportedPolicyConversionContext(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
                : base(endpoint)
            {
                this.bindingElements = endpoint.Binding.CreateBindingElements();
                this.bindingAssertions = new PolicyAssertionCollection();
                this.operationBindingAssertions = new Dictionary<OperationDescription, PolicyAssertionCollection>();
                this.messageBindingAssertions = new Dictionary<MessageDescription, PolicyAssertionCollection>();
                this.faultBindingAssertions = new Dictionary<FaultDescription, PolicyAssertionCollection>();
                this.bindingParameters = bindingParameters;
            }
 
            public override BindingElementCollection BindingElements
            {
                get { return this.bindingElements; }
            }
 
            internal override BindingParameterCollection BindingParameters
            {
                get { return this.bindingParameters; }
            }
 
            public override PolicyAssertionCollection GetBindingAssertions()
            {
                return bindingAssertions;
            }
 
            public override PolicyAssertionCollection GetOperationBindingAssertions(OperationDescription operation)
            {
                lock (operationBindingAssertions)
                {
                    if (!operationBindingAssertions.ContainsKey(operation))
                        operationBindingAssertions.Add(operation, new PolicyAssertionCollection());
                }
 
                return operationBindingAssertions[operation];
            }
 
            public override PolicyAssertionCollection GetMessageBindingAssertions(MessageDescription message)
            {
                lock (messageBindingAssertions)
                {
                    if (!messageBindingAssertions.ContainsKey(message))
                        messageBindingAssertions.Add(message, new PolicyAssertionCollection());
                }
                return messageBindingAssertions[message];
            }
 
            public override PolicyAssertionCollection GetFaultBindingAssertions(FaultDescription fault)
            {
                lock (faultBindingAssertions)
                {
                    if (!faultBindingAssertions.ContainsKey(fault))
                        faultBindingAssertions.Add(fault, new PolicyAssertionCollection());
                }
                return faultBindingAssertions[fault];
            }
 
        }
 
        Exception CreateExtensionException(IPolicyExportExtension exporter, Exception e)
        {
            string errorMessage = SR.GetString(SR.PolicyExtensionExportError, exporter.GetType(), e.Message);
            return new InvalidOperationException(errorMessage, e);
        }
    }
}