171 lines
7.4 KiB
C#
171 lines
7.4 KiB
C#
|
//------------------------------------------------------------------------------
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
namespace System.ServiceModel.Configuration
|
||
|
{
|
||
|
using System.Collections.Generic;
|
||
|
using System.Configuration;
|
||
|
using System.Globalization;
|
||
|
using System.Runtime;
|
||
|
using System.ServiceModel.Channels;
|
||
|
using System.ServiceModel.Description;
|
||
|
using System.Text;
|
||
|
using System.Xml;
|
||
|
|
||
|
sealed partial class UnrecognizedPolicyAssertionElement : BindingElementExtensionElement
|
||
|
{
|
||
|
XmlQualifiedName wsdlBinding;
|
||
|
ICollection<XmlElement> bindingAsserions;
|
||
|
IDictionary<OperationDescription, ICollection<XmlElement>> operationAssertions;
|
||
|
IDictionary<MessageDescription, ICollection<XmlElement>> messageAssertions;
|
||
|
|
||
|
|
||
|
public override Type BindingElementType
|
||
|
{
|
||
|
get { return typeof(UnrecognizedAssertionsBindingElement); }
|
||
|
}
|
||
|
|
||
|
public override void CopyFrom(ServiceModelExtensionElement from)
|
||
|
{
|
||
|
base.CopyFrom(from);
|
||
|
|
||
|
UnrecognizedPolicyAssertionElement source = (UnrecognizedPolicyAssertionElement)from;
|
||
|
#pragma warning suppress 56506 //markg; base.CopyFrom() checks for 'from' being null
|
||
|
this.wsdlBinding = source.wsdlBinding;
|
||
|
this.bindingAsserions = source.bindingAsserions;
|
||
|
this.operationAssertions = source.operationAssertions;
|
||
|
this.messageAssertions = source.messageAssertions;
|
||
|
}
|
||
|
|
||
|
protected internal override BindingElement CreateBindingElement()
|
||
|
{
|
||
|
return new UnrecognizedAssertionsBindingElement(XmlQualifiedName.Empty, null);
|
||
|
}
|
||
|
|
||
|
protected internal override void InitializeFrom(BindingElement bindingElement)
|
||
|
{
|
||
|
base.InitializeFrom(bindingElement);
|
||
|
UnrecognizedAssertionsBindingElement binding = (UnrecognizedAssertionsBindingElement)bindingElement;
|
||
|
|
||
|
this.wsdlBinding = binding.WsdlBinding;
|
||
|
this.bindingAsserions = binding.BindingAsserions;
|
||
|
this.operationAssertions = binding.OperationAssertions;
|
||
|
this.messageAssertions = binding.MessageAssertions;
|
||
|
}
|
||
|
|
||
|
protected override bool SerializeToXmlElement(XmlWriter writer, String elementName)
|
||
|
{
|
||
|
XmlDocument document = new XmlDocument();
|
||
|
if (writer != null && this.bindingAsserions != null && this.bindingAsserions.Count > 0)
|
||
|
{
|
||
|
int indent = 1;
|
||
|
XmlWriterSettings settings = WriterSettings(writer);
|
||
|
Fx.Assert(this.wsdlBinding != null, "");
|
||
|
WriteComment(SR.GetString(SR.UnrecognizedBindingAssertions1, this.wsdlBinding.Namespace), indent, writer, settings);
|
||
|
WriteComment(String.Format(CultureInfo.InvariantCulture, "<wsdl:binding name='{0}'>", this.wsdlBinding.Name), indent, writer, settings);
|
||
|
indent++;
|
||
|
foreach (XmlElement assertion in this.bindingAsserions)
|
||
|
{
|
||
|
WriteComment(ToString(assertion, document), indent, writer, settings);
|
||
|
}
|
||
|
if (this.operationAssertions == null || this.operationAssertions.Count == 0)
|
||
|
return true;
|
||
|
|
||
|
foreach (OperationDescription operation in this.operationAssertions.Keys)
|
||
|
{
|
||
|
WriteComment(String.Format(CultureInfo.InvariantCulture, "<wsdl:operation name='{0}'>", operation.Name), indent, writer, settings);
|
||
|
indent++;
|
||
|
foreach (XmlElement assertion in this.operationAssertions[operation])
|
||
|
{
|
||
|
WriteComment(ToString(assertion, document), indent, writer, settings);
|
||
|
}
|
||
|
|
||
|
if (this.messageAssertions == null || this.messageAssertions.Count == 0)
|
||
|
return true;
|
||
|
|
||
|
foreach (MessageDescription message in operation.Messages)
|
||
|
{
|
||
|
ICollection<XmlElement> assertions;
|
||
|
if (this.messageAssertions.TryGetValue(message, out assertions))
|
||
|
{
|
||
|
if (message.Direction == MessageDirection.Input)
|
||
|
WriteComment("<wsdl:input>", indent, writer, settings);
|
||
|
else if (message.Direction == MessageDirection.Output)
|
||
|
WriteComment("<wsdl:output>", indent, writer, settings);
|
||
|
foreach (XmlElement assertion in assertions)
|
||
|
{
|
||
|
WriteComment(ToString(assertion, document), indent + 1, writer, settings);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
protected override void Unmerge(ConfigurationElement sourceElement, ConfigurationElement parentElement, ConfigurationSaveMode saveMode)
|
||
|
{
|
||
|
if (sourceElement is UnrecognizedPolicyAssertionElement)
|
||
|
{
|
||
|
this.wsdlBinding = ((UnrecognizedPolicyAssertionElement)sourceElement).wsdlBinding;
|
||
|
this.bindingAsserions = ((UnrecognizedPolicyAssertionElement)sourceElement).bindingAsserions;
|
||
|
this.operationAssertions = ((UnrecognizedPolicyAssertionElement)sourceElement).operationAssertions;
|
||
|
this.messageAssertions = ((UnrecognizedPolicyAssertionElement)sourceElement).messageAssertions;
|
||
|
}
|
||
|
base.Unmerge(sourceElement, parentElement, saveMode);
|
||
|
}
|
||
|
|
||
|
string ToString(XmlElement e, XmlDocument document)
|
||
|
{
|
||
|
XmlElement top = document.CreateElement(e.Prefix, e.LocalName, e.NamespaceURI);
|
||
|
top.InsertBefore(document.CreateTextNode(".."), null);
|
||
|
return top.OuterXml;
|
||
|
}
|
||
|
|
||
|
void WriteComment(string text, int indent, XmlWriter writer, XmlWriterSettings settings)
|
||
|
{
|
||
|
if (settings.Indent)
|
||
|
{
|
||
|
// indent is always > 0
|
||
|
StringBuilder sb = new StringBuilder();
|
||
|
for (int i = 0; i < indent; i++)
|
||
|
{
|
||
|
sb.Append(settings.IndentChars);
|
||
|
}
|
||
|
sb.Append(text);
|
||
|
sb.Append(settings.IndentChars);
|
||
|
text = sb.ToString();
|
||
|
}
|
||
|
writer.WriteComment(text);
|
||
|
}
|
||
|
|
||
|
XmlWriterSettings WriterSettings(XmlWriter writer)
|
||
|
{
|
||
|
if (writer.Settings == null)
|
||
|
{
|
||
|
// V1 writers
|
||
|
XmlWriterSettings settings = new XmlWriterSettings();
|
||
|
XmlTextWriter xmlTextWriter = writer as XmlTextWriter;
|
||
|
if (xmlTextWriter != null)
|
||
|
{
|
||
|
settings.Indent = xmlTextWriter.Formatting == Formatting.Indented;
|
||
|
if (settings.Indent && xmlTextWriter.Indentation > 0)
|
||
|
{
|
||
|
StringBuilder sb = new StringBuilder(xmlTextWriter.Indentation);
|
||
|
for (int i = 0; i < xmlTextWriter.Indentation; i++)
|
||
|
sb.Append(xmlTextWriter.IndentChar);
|
||
|
settings.IndentChars = sb.ToString();
|
||
|
}
|
||
|
}
|
||
|
return settings;
|
||
|
}
|
||
|
return writer.Settings;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|