Updates referencesource to .NET 4.7
[mono.git] / mcs / class / referencesource / System.Data.Entity / System / Data / EntityModel / SchemaObjectModel / FacetEnabledSchemaElement.cs
1 //---------------------------------------------------------------------
2 // <copyright file="FacetEnabledSchemaElement.cs" company="Microsoft">
3 //      Copyright (c) Microsoft Corporation.  All rights reserved.
4 // </copyright>
5 //
6 // @owner       Microsoft
7 // @backupOwner Microsoft
8 //---------------------------------------------------------------------
9
10 using System;
11 using System.Collections.Generic;
12 using System.Linq;
13 using System.Text;
14 using System.Data.Metadata.Edm;
15 using System.Diagnostics;
16 using System.Xml;
17
18 namespace System.Data.EntityModel.SchemaObjectModel
19 {
20     internal abstract class FacetEnabledSchemaElement : SchemaElement
21     {
22         protected SchemaType _type = null;
23         protected string _unresolvedType = null;
24         protected TypeUsageBuilder _typeUsageBuilder;
25
26         #region Properties
27
28         internal new Function ParentElement
29         {
30             get
31             {
32                 return base.ParentElement as Function;
33             }
34         }
35
36         internal SchemaType Type
37         {
38             get
39             {
40                 return _type;
41             }
42         }
43
44         internal virtual TypeUsage TypeUsage
45         {
46             get
47             {
48                 return _typeUsageBuilder.TypeUsage;
49             }
50         }
51
52         internal TypeUsageBuilder TypeUsageBuilder
53         {
54             get
55             {
56                 return _typeUsageBuilder;
57             }
58         }
59
60         internal bool HasUserDefinedFacets
61         {
62             get
63             {
64                 return _typeUsageBuilder.HasUserDefinedFacets;
65             }
66         }
67
68         internal string UnresolvedType
69         {
70             get
71             {
72                 return _unresolvedType;
73             }
74             set
75             {
76                 _unresolvedType = value;
77             }
78         }
79         #endregion
80
81         #region Methods
82
83         /// <summary>
84         /// 
85         /// </summary>
86         /// <param name="parentElement"></param>
87         internal FacetEnabledSchemaElement(Function parentElement)
88             : base(parentElement)
89         {
90
91         }
92
93         internal FacetEnabledSchemaElement(SchemaElement parentElement)
94             : base(parentElement)
95         {
96
97         }
98
99         internal override void ResolveTopLevelNames()
100         {
101             base.ResolveTopLevelNames();
102             
103             Debug.Assert(this.Type == null, "This must be resolved exactly once");
104
105             if (Schema.ResolveTypeName(this, UnresolvedType, out _type))
106             {
107                 if (Schema.DataModel == SchemaDataModelOption.ProviderManifestModel && _typeUsageBuilder.HasUserDefinedFacets)
108                 {
109                     bool isInProviderManifest = Schema.DataModel == SchemaDataModelOption.ProviderManifestModel;
110                     _typeUsageBuilder.ValidateAndSetTypeUsage((ScalarType)_type, !isInProviderManifest);
111                 }
112             }
113         }
114
115         internal void ValidateAndSetTypeUsage(ScalarType scalar)
116         {
117             _typeUsageBuilder.ValidateAndSetTypeUsage(scalar, false);
118         }
119
120         internal void ValidateAndSetTypeUsage(EdmType edmType)
121         {
122             _typeUsageBuilder.ValidateAndSetTypeUsage(edmType, false);
123         }
124
125         #endregion
126
127         protected override bool HandleAttribute(XmlReader reader)
128         {
129             if (base.HandleAttribute(reader))
130             {
131                 return true;
132             }
133             else if (_typeUsageBuilder.HandleAttribute(reader))
134             {
135                 return true;
136             }
137
138             return false;
139         }
140
141     }
142 }