File: MetadataExporter.cs

package info (click to toggle)
mono 4.6.2.7%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 778,148 kB
  • ctags: 914,052
  • sloc: cs: 5,779,509; xml: 2,773,713; ansic: 432,645; sh: 14,749; makefile: 12,361; perl: 2,488; python: 1,434; cpp: 849; asm: 531; sql: 95; sed: 16; php: 1
file content (151 lines) | stat: -rw-r--r-- 6,181 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
//-----------------------------------------------------------------------------
// 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);
        }
    }
}