e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
152 lines
6.0 KiB
C#
152 lines
6.0 KiB
C#
//-----------------------------------------------------------------------------
|
|
// 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);
|
|
}
|
|
}
|
|
}
|