| File: FrameworkFork\System.ServiceModel\System\ServiceModel\Description\MetadataExporter.cs | Web Access |
| Project: src\src\dotnet-svcutil\lib\src\dotnet-svcutil-lib.csproj (dotnet-svcutil-lib) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. 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 { private PolicyVersion _policyVersion = PolicyVersion.Policy12; private readonly Collection<MetadataConversionError> _errors = new Collection<MetadataConversionError>(); private 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 _policyVersion; } set { if (value == null) throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("value"); _policyVersion = value; } } public Collection<MetadataConversionError> Errors { get { return _errors; } } public Dictionary<object, object> State { get { return _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 disable 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); } private sealed class ExportedPolicyConversionContext : PolicyConversionContext { private readonly BindingElementCollection _bindingElements; private PolicyAssertionCollection _bindingAssertions; private Dictionary<OperationDescription, PolicyAssertionCollection> _operationBindingAssertions; private Dictionary<MessageDescription, PolicyAssertionCollection> _messageBindingAssertions; private Dictionary<FaultDescription, PolicyAssertionCollection> _faultBindingAssertions; private BindingParameterCollection _bindingParameters; internal ExportedPolicyConversionContext(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) : base(endpoint) { _bindingElements = endpoint.Binding.CreateBindingElements(); _bindingAssertions = new PolicyAssertionCollection(); _operationBindingAssertions = new Dictionary<OperationDescription, PolicyAssertionCollection>(); _messageBindingAssertions = new Dictionary<MessageDescription, PolicyAssertionCollection>(); _faultBindingAssertions = new Dictionary<FaultDescription, PolicyAssertionCollection>(); _bindingParameters = bindingParameters; } public override BindingElementCollection BindingElements { get { return _bindingElements; } } internal override BindingParameterCollection BindingParameters { get { return _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]; } } private Exception CreateExtensionException(IPolicyExportExtension exporter, Exception e) { string errorMessage = string.Format(SRServiceModel.PolicyExtensionExportError, exporter.GetType(), e.Message); return new InvalidOperationException(errorMessage, e); } } }