This repository was archived by the owner on Feb 26, 2022. It is now read-only.
Repository navigation
Expand file tree
/
Copy pathuMapper.cs
More file actions
339 lines (304 loc) · 13.9 KB
/
Copy pathuMapper.cs
File metadata and controls
339 lines (304 loc) · 13.9 KB
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using umbraco.NodeFactory;
using umbraco;
using System.Linq.Expressions;
using System.Reflection;
using System.Web;
namespace uComponents.Mapping
{
/// <summary>
/// Maps Umbraco <c>Node</c>s to strongly typed models.
/// </summary>
/// <remarks>
/// This is a static convenience class which wraps single instance of a <c>NodeMappingEngine</c>.
/// See http://ucomponents.github.io/umapper/ for usage examples and pretty pictures.
/// </remarks>
public static class uMapper
{
private static NodeMappingEngine _engine = new NodeMappingEngine();
/// <summary>
/// Gets the <c>INodeMappingEngine</c> being used by uMapper.
/// </summary>
public static INodeMappingEngine Engine
{
get { return _engine; }
}
/// <summary>
/// Enables or disables caching, using the <c>HttpContext.Current.Cache</c>
/// object.
///
/// Caching is disabled by default.
/// </summary>
/// <exception cref="InvalidOperationException">
/// If <c>HttpContext.Current</c> is not set.
/// </exception>
public static bool CachingEnabled
{
get
{
return _engine.IsCachingEnabled;
}
set
{
if (value)
{
if (HttpContext.Current == null)
{
throw new InvalidOperationException("The current HttpContext is not available - caching cannot be enabled");
}
_engine.SetCacheProvider(new DefaultCacheProvider(HttpContext.Current.Cache));
}
else
{
_engine.SetCacheProvider(null);
}
}
}
/// <summary>
/// Creates a map to <typeparamref name="TDestination" /> from an Umbraco document type,
/// which must have the same alias as the unqualified class name of
/// <typeparamref name="TDestination"/>.
/// </summary>
/// <typeparam name="TDestination">The type to map to.</typeparam>
/// <returns>Fluent configuration for the newly created mapping.</returns>
/// <exception cref="DocumentTypeNotFoundException">If a suitable document type could not be found</exception>
public static INodeMappingExpression<TDestination> CreateMap<TDestination>()
where TDestination : class, new()
{
return _engine.CreateMap<TDestination>();
}
/// <summary>
/// Creates a map to <typeparamref name="TDestination" /> from an Umbraco document type,
/// specifying the document type alias.
/// </summary>
/// <typeparam name="TDestination">The type to map to.</typeparam>
/// <param name="documentTypeAlias">The document type alias to map from.</param>
/// <returns>Fluent configuration for the newly created mapping.</returns>
/// <exception cref="DocumentTypeNotFoundException">If the document type could not be found.</exception>
public static INodeMappingExpression<TDestination> CreateMap<TDestination>(string documentTypeAlias)
where TDestination : class, new()
{
return _engine.CreateMap<TDestination>(documentTypeAlias);
}
/// <summary>
/// Maps an Umbraco <c>Node</c> to a new instance of <typeparamref name="TDestination"/>.
/// </summary>
/// <typeparam name="TDestination">The type to map to.</typeparam>
/// <param name="sourceNode">The <c>Node</c> to map from.</param>
/// <param name="includeRelationships">Whether to load relationships.</param>
/// <returns>
/// A new instance of <typeparamref name="TDestination"/>, or <c>null</c> if
/// <paramref name="sourceNode"/> is <c>null</c> or does not map to
/// <typeparamref name="TDestination"/>.
/// </returns>
/// <exception cref="MapNotFoundException">
/// If a map for <typeparamref name="TDestination"/> has not
/// been created with <see cref="CreateMap()" />.
/// </exception>
public static TDestination Map<TDestination>(Node sourceNode, bool includeRelationships = true)
where TDestination : class, new()
{
if (sourceNode == null || string.IsNullOrEmpty(sourceNode.Name))
{
return null;
}
var paths = includeRelationships
? null // all
: new string[0]; // none
var context = new NodeMappingContext(sourceNode, paths, null);
return (TDestination)_engine.Map(context, typeof(TDestination));
}
/// <summary>
/// Gets an Umbraco <c>Node</c> as a new instance of <typeparamref name="TDestination"/>.
/// </summary>
/// <typeparam name="TDestination">The type that the <c>Node</c> maps to.</typeparam>
/// <param name="id">The ID of the <c>Node</c></param>
/// <param name="includeRelationships">Whether to load all the <c>Node</c>'s relationships</param>
/// <returns>
/// <c>null</c> if the <c>Node</c> does not exist or does not map to
/// <typeparamref name="TDestination"/>.
/// </returns>
/// <exception cref="MapNotFoundException">
/// If a map for <typeparamref name="TDestination"/> has not
/// been created with <see cref="CreateMap()" />.
/// </exception>
public static TDestination Find<TDestination>(int id, bool includeRelationships = true)
{
var paths = includeRelationships
? null // all
: new string[0]; // none
var context = new NodeMappingContext(id, paths, null);
return (TDestination)_engine.Map(context, typeof(TDestination));
}
/// <summary>
/// Gets the current Umbraco <c>Node</c> as a new instance of <typeparamref name="TDestination"/>.
/// </summary>
/// <typeparam name="TDestination">The type that the current <c>Node</c> maps to.</typeparam>
/// <param name="includeRelationships">Whether to load all the <c>Node</c>'s relationships</param>
/// <returns>
/// <c>null</c> if there is no current <c>Node</c> or it does not map to
/// <typeparamref name="TDestination"/>.
/// </returns>
/// <exception cref="MapNotFoundException">
/// If a map for <typeparamref name="TDestination"/> has not
/// been created with <see cref="CreateMap()" />.
/// </exception>
/// <seealso cref="GetSingle(int, bool)"/>
public static TDestination GetCurrent<TDestination>(bool includeRelationships = true)
where TDestination : class, new()
{
var node = Node.GetCurrent();
if (node == null)
{
return null;
}
var paths = includeRelationships
? null // all
: new string[0]; // none
var context = new NodeMappingContext(node, paths, null);
return (TDestination)_engine.Map(context, typeof(TDestination));
}
/// <summary>
/// Gets all Umbraco <c>Node</c>s which map to <typeparamref name="TDestination"/> (including nodes which
/// map to a class which derives from <typeparamref name="TDestination"/>).
/// </summary>
/// <typeparam name="TDestination">The type for the <c>Node</c>s to map to.</typeparam>
/// <param name="includeRelationships">Whether to load all the <c>Node</c>s' relationships</param>
/// <exception cref="MapNotFoundException">
/// If a map for <typeparamref name="TDestination"/> has not
/// been created with <see cref="CreateMap()" />.
/// </exception>
public static IEnumerable<TDestination> GetAll<TDestination>(bool includeRelationships = true)
where TDestination : class, new()
{
var destinationType = typeof(TDestination);
if (!_engine.NodeMappers.ContainsKey(destinationType))
{
throw new MapNotFoundException(destinationType);
}
var paths = includeRelationships
? _engine.NodeMappers[destinationType]
.PropertyMappers
.Where(x => x.RequiresInclude)
.Select(x => x.DestinationInfo.Name)
.ToArray() // all
: new string[0]; // none
var query = Query<TDestination>();
foreach (var path in paths)
{
query.Include(path);
}
return query;
}
/// <summary>
/// Gets a query for nodes which map to <typeparamref name="TDestination"/>.
/// </summary>
/// <typeparam name="TDestination">The type to map to.</typeparam>
/// <returns>A fluent configuration for the query.</returns>
/// <exception cref="MapNotFoundException">
/// If a suitable map for <typeparamref name="TDestination"/> has not
/// been created with <see cref="CreateMap()" />.
/// </exception>
public static INodeQuery<TDestination> Query<TDestination>()
where TDestination : class, new()
{
return _engine.Query<TDestination>();
}
#region Legacy
/// <summary>
/// Use <c>Find()</c> instead.
/// </summary>
[Obsolete("Use Find() instead")]
public static TDestination GetSingle<TDestination>(int id, bool includeRelationships = true)
where TDestination : class, new()
{
var paths = includeRelationships
? null // all
: new string[0]; // none
return (TDestination)_engine.Map(new Node(id), typeof(TDestination), paths);
}
/// <summary>
/// Gets an Umbraco <c>Node</c> as a new instance of <typeparamref name="TDestination"/>,
/// only including the specified relationships.
/// </summary>
/// <typeparam name="TDestination">The type that the <c>Node</c> maps to.</typeparam>
/// <param name="id">The ID of the <c>Node</c></param>
/// <param name="includedRelationships">
/// The relationships to populate <typeparamref name="TDestination"/> with.
/// </param>
/// <returns>
/// <c>null</c> if the <c>Node</c> does not exist or does not map to
/// <typeparamref name="TDestination"/>.
/// </returns>
/// <exception cref="MapNotFoundException">
/// If a map for <typeparamref name="TDestination"/> has not
/// been created with <see cref="CreateMap()" />.
/// </exception>
/// <example>
/// <code>
/// var person = uMapper.GetSingle(1234, x => x.Friends, x => x.Parent);
/// person.Name; // not a relationship and not null
/// person.Friends; // not null
/// person.Parent; // not null
/// person.Colleagues; // null
/// </code>
/// </example>
[Obsolete("Use node queries with paths instead, via uMapper.Query()")]
public static TDestination GetSingle<TDestination>(int id, params Expression<Func<TDestination, object>>[] includedRelationships)
where TDestination : class, new()
{
return _engine.Map<TDestination>(new Node(id), includedRelationships);
}
/// <summary>
/// Gets the current Umbraco <c>Node</c> as a new instance of <typeparamref name="TDestination"/>,
/// only including the specified relationships.
/// </summary>
/// <typeparam name="TDestination">The type that the current <c>Node</c> maps to.</typeparam>
/// <param name="includedRelationships">
/// The relationships to populate <typeparamref name="TDestination"/> with.
/// </param>
/// <returns>
/// <c>null</c> if there is no current <c>Node</c> or it does not map to
/// <typeparamref name="TDestination"/>.
/// </returns>
[Obsolete("Use node queries with paths instead, via uMapper.Query()")]
public static TDestination GetCurrent<TDestination>(params Expression<Func<TDestination, object>>[] includedRelationships)
where TDestination : class, new()
{
return _engine.Map<TDestination>(Node.GetCurrent(), includedRelationships);
}
/// <summary>
/// Gets all Umbraco <c>Node</c>s which map to <typeparamref name="TDestination"/> (including nodes which
/// map to a class which derives from <typeparamref name="TDestination"/>),
/// only including the specified relationships.
/// </summary>
/// <typeparam name="TDestination">The type for the <c>Node</c>s to map to.</typeparam>
/// <param name="includedRelationships">
/// The relationships to populate the <typeparamref name="TDestination"/>s with.
/// </param>
/// <exception cref="MapNotFoundException">
/// If a map for <typeparamref name="TDestination"/> has not
/// been created with <see cref="CreateMap()" />.
/// </exception>
[Obsolete("Use node queries with paths instead, via uMapper.Query()")]
public static IEnumerable<TDestination> GetAll<TDestination>(params Expression<Func<TDestination, object>>[] includedRelationships)
where TDestination : class, new()
{
var paths = includedRelationships
.Select(e => (e.Body as MemberExpression).Member as PropertyInfo)
.Select(x => x.Name)
.ToArray();
var query = Query<TDestination>();
foreach (var path in paths)
{
query.Include(path);
}
return query.AsEnumerable();
}
#endregion
}
}