//----------------------------------------------------------------------------- // 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 errors = new Collection(); readonly Dictionary state = new Dictionary(); //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 Errors { get { return this.errors; } } public Dictionary 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()) 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 operationBindingAssertions; Dictionary messageBindingAssertions; Dictionary faultBindingAssertions; BindingParameterCollection bindingParameters; internal ExportedPolicyConversionContext(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) : base(endpoint) { this.bindingElements = endpoint.Binding.CreateBindingElements(); this.bindingAssertions = new PolicyAssertionCollection(); this.operationBindingAssertions = new Dictionary(); this.messageBindingAssertions = new Dictionary(); this.faultBindingAssertions = new Dictionary(); 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); } } }