< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.Runtime.Serialization.DataContractSetEx
Assembly: CoreWCF.Primitives
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Runtime/Serialization/DataContractSetEx.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 85
Coverable lines: 85
Total lines: 226
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 56
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor()100%110%
.ctor(...)0%440%
Add(...)100%110%
EnsureTypeNotGeneric(...)0%220%
Add(...)100%110%
Add(...)0%220%
InternalAdd(...)0%18180%
AddClassDataContract(...)0%880%
AddCollectionDataContract(...)0%440%
AddXmlDataContract(...)100%110%
AddKnownDataContracts(...)0%880%
IsKeyValuePair(...)0%220%
GetMemberTypeDataContract(...)0%440%
GetItemTypeDataContract(...)0%220%
FixupDataContracts()0%220%
.cctor()100%110%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Runtime/Serialization/DataContractSetEx.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System;
 5using System.Collections;
 6using System.Runtime.Serialization;
 7using System.Xml;
 8
 9namespace CoreWCF.Runtime.Serialization
 10{
 11    internal class DataContractSetEx
 12    {
 13        internal const string RemoveKeyValuePairFromWsdl = "CoreWCF.RemoveKeyValuePairFromWsdl";
 014        internal bool _removeKeyValuePairFromWsdl = AppContext.TryGetSwitch(RemoveKeyValuePairFromWsdl, out bool enabled
 15
 016        internal DataContractSetEx()
 17        {
 018            Wrapped = FormatterServices.GetUninitializedObject(s_dataContractSetType);
 019        }
 20
 021        internal DataContractSetEx(DataContractSetEx dataContractSet) : this()
 22        {
 023            foreach (var key in dataContractSet.Contracts.Keys)
 24            {
 025                Contracts[key] = dataContractSet.Contracts[key];
 26            }
 27
 028            foreach (var key in dataContractSet.ProcessedContracts.Keys)
 29            {
 030                ProcessedContracts[key] = dataContractSet.ProcessedContracts[key];
 31            }
 032        }
 33
 034        public object Wrapped { get; }
 35
 036        public IDictionary Contracts => s_getContracts(Wrapped);
 37
 038        public IDictionary ProcessedContracts => s_getProcessedContracts(Wrapped);
 39
 40        internal void Add(Type type)
 41        {
 042            DataContractEx dataContract = DataContractEx.GetDataContract(type);
 043            EnsureTypeNotGeneric(dataContract.UnderlyingType);
 044            Add(dataContract);
 045        }
 46
 47        internal static void EnsureTypeNotGeneric(Type type)
 48        {
 049            if (type.ContainsGenericParameters)
 050                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.Format(SR.
 051        }
 52
 53        private void Add(DataContractEx dataContract)
 54        {
 055            Add(dataContract.StableName, dataContract);
 056        }
 57
 58        public void Add(XmlQualifiedName name, DataContractEx dataContract)
 59        {
 060            if (dataContract.IsBuiltInDataContract)
 061                return;
 062            InternalAdd(name, dataContract);
 063        }
 64
 65        internal void InternalAdd(XmlQualifiedName name, DataContractEx dataContract)
 66        {
 67            DataContractEx dataContractInSet;
 068            if (Contracts.Contains(name))
 69            {
 070                dataContractInSet = DataContractEx.Wrap(Contracts[name]);
 071                if (!dataContractInSet.Equals(dataContract.WrappedDataContract))
 72                {
 073                    if (dataContract.UnderlyingType == null || dataContractInSet.UnderlyingType == null)
 074                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.Forma
 75                    else
 76                    {
 077                        bool typeNamesEqual = (DataContractEx.GetClrTypeFullName(dataContract.UnderlyingType) == DataCon
 078                        throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.Forma
 79                    }
 80                }
 81            }
 82            else
 83            {
 084                Contracts.Add(name, dataContract.WrappedDataContract);
 85
 086                if (dataContract is ClassDataContractEx classDataContract)
 87                {
 088                    AddClassDataContract(classDataContract);
 89                }
 090                else if (dataContract is CollectionDataContractEx collectionDataContract)
 91                {
 092                    AddCollectionDataContract(collectionDataContract);
 93                }
 094                else if (dataContract is XmlDataContractEx xmlDataContract)
 95                {
 096                    AddXmlDataContract(xmlDataContract);
 97                }
 98            }
 099        }
 100
 101        private void AddClassDataContract(ClassDataContractEx classDataContract)
 102        {
 0103            if (classDataContract.BaseContract != null)
 104            {
 0105                Add(classDataContract.BaseContract.StableName, classDataContract.BaseContract);
 106            }
 0107            if (!classDataContract.IsISerializable)
 108            {
 0109                if (classDataContract.Members != null)
 110                {
 0111                    for (int i = 0; i < classDataContract.Members.Count; i++)
 112                    {
 0113                        DataMemberEx dataMember = classDataContract.Members[i];
 0114                        DataContractEx memberDataContract = GetMemberTypeDataContract(dataMember);
 115                        //if (dataContractSurrogate != null && dataMember.MemberInfo != null)
 116                        //{
 117                        //    object customData = DataContractSurrogateCaller.GetCustomDataToExport(
 118                        //                           dataContractSurrogate,
 119                        //                           dataMember.MemberInfo,
 120                        //                           memberDataContract.UnderlyingType);
 121                        //    if (customData != null)
 122                        //        SurrogateDataTable.Add(dataMember, customData);
 123                        //}
 0124                        Add(memberDataContract.StableName, memberDataContract);
 125                    }
 126                }
 127            }
 0128            AddKnownDataContracts(classDataContract.KnownDataContracts);
 0129        }
 130
 131        private void AddCollectionDataContract(CollectionDataContractEx collectionDataContract)
 132        {
 0133            if (collectionDataContract.IsDictionary)
 134            {
 0135                ClassDataContractEx keyValueContract = collectionDataContract.ItemContract as ClassDataContractEx;
 0136                AddClassDataContract(keyValueContract);
 137            }
 138            else
 139            {
 0140                DataContractEx itemContract = GetItemTypeDataContract(collectionDataContract);
 0141                if (itemContract != null)
 0142                    Add(itemContract.StableName, itemContract);
 143            }
 0144            AddKnownDataContracts(collectionDataContract.KnownDataContracts);
 0145        }
 146
 147        private void AddXmlDataContract(XmlDataContractEx xmlDataContract)
 148        {
 0149            AddKnownDataContracts(xmlDataContract.KnownDataContracts);
 0150        }
 151
 152        private void AddKnownDataContracts(IDictionary knownDataContracts)
 153        {
 0154            if (knownDataContracts != null)
 155            {
 0156                foreach (object knownDataContract in knownDataContracts.Values)
 157                {
 0158                    var dataContract = DataContractEx.Wrap(knownDataContract);
 159                    // Workaround for DataContract adding an extra schema entry for KeyValue<K,V>. See GitHub
 160                    // issue https://github.com/dotnet/runtime/issues/67949 for details.
 0161                    if (_removeKeyValuePairFromWsdl && IsKeyValuePair(dataContract))
 162                        continue;
 163
 0164                    Add(dataContract);
 165                }
 166            }
 0167        }
 168
 169        private bool IsKeyValuePair(DataContractEx dataContract)
 170        {
 0171            var stableName = dataContract.StableName;
 0172            return stableName.Namespace == "http://schemas.datacontract.org/2004/07/System.Collections.Generic"
 0173                                           && stableName.Name.StartsWith("KeyValuePairOf");
 174        }
 175
 176        internal DataContractEx GetMemberTypeDataContract(DataMemberEx dataMember)
 177        {
 0178            if (dataMember.MemberInfo != null)
 179            {
 0180                Type dataMemberType = dataMember.MemberType;
 0181                if (dataMember.IsGetOnlyCollection)
 182                {
 183                    //if (dataContractSurrogate != null)
 184                    //{
 185                    //    Type dcType = DataContractSurrogateCaller.GetDataContractType(dataContractSurrogate, dataMembe
 186                    //    if (dcType != dataMemberType)
 187                    //    {
 188                    //        throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new
 189                    //            DataContract.GetClrTypeFullName(dataMemberType), DataContract.GetClrTypeFullName(dataM
 190                    //    }
 191                    //}
 0192                    return DataContractEx.GetGetOnlyCollectionDataContract(DataContractEx.GetId(dataMemberType.TypeHandl
 193                }
 194                else
 195                {
 0196                    return DataContractEx.GetDataContract(dataMemberType);
 197                }
 198            }
 0199            return dataMember.MemberTypeContract;
 200        }
 201
 202        internal DataContractEx GetItemTypeDataContract(CollectionDataContractEx collectionContract)
 203        {
 0204            if (collectionContract.ItemType != null)
 0205                return DataContractEx.GetDataContract(collectionContract.ItemType);
 0206            return collectionContract.ItemContract;
 207        }
 208
 209        internal void FixupDataContracts()
 210        {
 211            // This fixes the Enum data contract to have an underlying type
 212            // and for collections of KeyValuePairAdapter to have IsValueType set to true
 213            // and the key and value members to be required. This is done by ensuring all
 214            // types get wrapped at least once. The wrapping constructor fixes up the
 215            // necessary data.
 0216            foreach(object contractObj in Contracts.Values)
 217            {
 0218                DataContractEx.Wrap(contractObj);
 219            }
 0220        }
 221
 0222        private static Type s_dataContractSetType = typeof(DataContractSerializer).Assembly.GetType("System.Runtime.Seri
 0223        private static Func<object, IDictionary> s_getContracts = ReflectionHelper.GetPropertyDelegate<IDictionary>(s_da
 0224        private static Func<object, IDictionary> s_getProcessedContracts = ReflectionHelper.GetPropertyDelegate<IDiction
 225    }
 226}