Update Reference Sources to .NET Framework 4.6.1
[mono.git] / mcs / class / referencesource / System.Data.Entity / System / Data / EntityModel / SchemaObjectModel / RowTypeElement.cs
1 //---------------------------------------------------------------------
2 // <copyright file="RowTypeElement.cs" company="Microsoft">
3 //      Copyright (c) Microsoft Corporation.  All rights reserved.
4 // </copyright>
5 //
6 // @owner       [....]
7 // @backupOwner [....]
8 //---------------------------------------------------------------------
9
10 namespace System.Data.EntityModel.SchemaObjectModel
11 {
12     using System.Collections.Generic;
13     using System.Data.Entity;
14     using System.Data.Metadata.Edm;
15     using System.Diagnostics;
16     using System.Text;
17     using System.Xml;
18     using Som = System.Data.EntityModel.SchemaObjectModel;
19
20     class RowTypeElement : ModelFunctionTypeElement
21     {
22         private readonly SchemaElementLookUpTable<RowTypePropertyElement> _properties = new SchemaElementLookUpTable<RowTypePropertyElement>();
23
24         #region constructor
25         /// <summary>
26         /// 
27         /// </summary>
28         /// <param name="parentElement"></param>
29         internal RowTypeElement(SchemaElement parentElement)
30             : base(parentElement)
31         {
32         }
33
34
35         protected override bool HandleElement(XmlReader reader)
36         {
37
38             if (CanHandleElement(reader, XmlConstants.Property))
39             {
40                 HandlePropertyElement(reader);
41                 return true;
42             }
43             return false;
44         }
45
46         protected void HandlePropertyElement(XmlReader reader)
47         {
48             Debug.Assert(reader != null);
49
50             var property = new RowTypePropertyElement(this);
51             property.Parse(reader);
52             _properties.Add(property, true, Strings.DuplicateEntityContainerMemberName /**/);
53         }
54
55         #endregion
56
57         internal SchemaElementLookUpTable<RowTypePropertyElement> Properties
58         {
59             get { return _properties; }
60         }
61
62         internal override void ResolveTopLevelNames()
63         {
64
65             foreach (var property in _properties)
66             {
67                 property.ResolveTopLevelNames();
68             }
69
70         }
71
72         internal override void WriteIdentity(StringBuilder builder)
73         {
74             builder.Append("Row[");
75
76             bool first = true;
77             foreach (RowTypePropertyElement property in _properties)
78             {
79                 if (first)
80                 {
81                     first = !first;
82                 }
83                 else 
84                 {
85                     builder.Append(", ");
86                 }
87                 property.WriteIdentity(builder);
88             }
89             builder.Append("]");
90         }
91
92         internal override TypeUsage GetTypeUsage()
93         {
94             if (_typeUsage == null)
95             {
96                 var listOfProperties = new List<EdmProperty>();
97                 foreach (var property in _properties)
98                 {
99                     var edmProperty = new EdmProperty(property.FQName, property.GetTypeUsage());
100                     edmProperty.AddMetadataProperties(property.OtherContent);
101                     //edmProperty.DeclaringType
102                     listOfProperties.Add(edmProperty);
103                 }
104
105                 RowType rowType = new RowType(listOfProperties);
106                 if (Schema.DataModel == SchemaDataModelOption.EntityDataModel)
107                 {
108                     rowType.DataSpace = DataSpace.CSpace;
109                 }
110                 else
111                 {
112                     Debug.Assert(Schema.DataModel == SchemaDataModelOption.ProviderDataModel, "Only DataModel == SchemaDataModelOption.ProviderDataModel is expected");
113                     rowType.DataSpace = DataSpace.SSpace;
114                 }
115
116                 rowType.AddMetadataProperties(this.OtherContent);
117                 _typeUsage = TypeUsage.Create(rowType);
118             }
119             return _typeUsage;
120         }
121
122         internal override bool ResolveNameAndSetTypeUsage(Converter.ConversionCache convertedItemCache, Dictionary<Som.SchemaElement, GlobalItem> newGlobalItems)
123         {
124             bool result = true;
125             if (_typeUsage == null)
126             {
127                 foreach (var property in _properties)
128                 {
129                     if (!property.ResolveNameAndSetTypeUsage(convertedItemCache, newGlobalItems))
130                     {
131                         result = false;
132                     }
133                 }
134             }
135             return result;
136         }
137
138         internal override void Validate()
139         {
140             foreach (var property in _properties)
141             {
142                 property.Validate();
143             }
144
145             if (_properties.Count == 0)
146             {
147                 AddError(ErrorCode.RowTypeWithoutProperty, EdmSchemaErrorSeverity.Error, Strings.RowTypeWithoutProperty);
148             }
149         }
150     }
151 }