File: DynamicDataContainerColumnProvider.cs

package info (click to toggle)
mono-reference-assemblies 3.12.1%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 604,240 kB
  • ctags: 625,505
  • sloc: cs: 3,967,741; xml: 2,793,081; ansic: 418,042; java: 60,435; sh: 14,833; makefile: 11,576; sql: 7,956; perl: 1,467; cpp: 1,446; yacc: 1,203; python: 598; asm: 422; sed: 16; php: 1
file content (133 lines) | stat: -rw-r--r-- 3,383 bytes parent folder | download | duplicates (12)
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.DynamicData;
using System.Web.DynamicData.ModelProviders;

using MonoTests.DataSource;

namespace MonoTests.ModelProviders
{
	public class DynamicDataContainerColumnProvider <T> : ColumnProvider
	{
		DynamicDataColumn column;
		bool associationResolved;

		public override AssociationProvider Association	{
			get {
				ResolveAssociations ();
				return base.Association;
			}

			protected set {
				base.Association = value;
			}
		}

		public DynamicDataContainerColumnProvider (DynamicDataContainerTableProvider <T> owner, DynamicDataColumn column)
			: base (owner)
		{
			if (column == null)
				throw new ArgumentNullException ("column");

			this.column = column;

			Type columnType = column.DataType;
			if (columnType == null)
				throw new InvalidOperationException ("column.TContext must not be null for column '" + column.Name + "'");

			Name = column.Name;
			ColumnType = columnType;
			Nullable = columnType.IsGenericType && typeof (Nullable<>).IsAssignableFrom (columnType.GetGenericTypeDefinition ());
			IsPrimaryKey = column.PrimaryKey;
			EntityTypeProperty = GetPropertyInfo (owner.EntityType, Name);
			IsCustomProperty = column.CustomProperty;
			IsGenerated = column.Generated;
			MaxLength = GetMaxLength (EntityTypeProperty);
			IsSortable = column.Sortable;
		}

		public void ResolveAssociations ()
		{
			if (associationResolved)
				return;

			associationResolved = true;
			string associated = column.AssociatedTo;
			if (String.IsNullOrEmpty (associated))
				return;

			string[] names = associated.Split (new char[] { '.' });
			if (names.Length != 2)
				throw new ApplicationException ("Only associations of type Table.Column are supported");
			string tableName = names[0];
			string columnName = names[1];
			
			TableProvider tableProvider = null;
			try {
				tableProvider = Table.DataModel.Tables.First<TableProvider> ((TableProvider tp) => {
					if (tp.Name == tableName)
						return true;
					return false;
				});
			} catch {
				return;
			}

			if (tableProvider == null)
				return;

			ColumnProvider toColumn = null;

			try {
				toColumn = tableProvider.Columns.First<ColumnProvider> ((ColumnProvider cp) => {
					if (cp.Name == columnName)
						return true;
					return false;
				});
			} catch {
				return;
			}

			if (toColumn == null)
				return;

			IsForeignKeyComponent = true;
			Association = new DynamicDataAssociationProvider (column.AssociationDirection, this, toColumn);
		}

		int GetMaxLength (PropertyInfo pi)
		{
			if (pi == null)
				return 0;

			object[] attrs = pi.GetCustomAttributes (typeof (DynamicDataStringLengthAttribute), true);
			if (attrs == null || attrs.Length == 0)
				return 0;

			var attr = attrs[0] as DynamicDataStringLengthAttribute;
			if (attr == null)
				return 0;

			return attr.MaxLength;
		}

		PropertyInfo GetPropertyInfo (Type type, string name)
		{
			try {
				PropertyInfo ret = type.GetProperties (BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy).
					First<PropertyInfo> ((pi) => {
						if (String.Compare (pi.Name, name, StringComparison.Ordinal) == 0)
							return true;
						return false;
					}
				);
				return ret;
			} catch (InvalidOperationException ex) {
				return null;
			}
		}
	}
}