/
JsonFilter.cs
157 lines (135 loc) · 5.24 KB
/
JsonFilter.cs
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
using DevZest.Data.Primitives;
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace DevZest.Data
{
/// <summary>
/// Filters DataSet JSON serialization.
/// </summary>
public abstract class JsonFilter
{
/// <summary>
/// Gets the filter which excludes all projections.
/// </summary>
public static JsonFilter NoProjection { get { return NoProjectionJsonFilter.Singleton; } }
/// <summary>
/// Gets the filter which exclude all child DataSets.
/// </summary>
public static JsonFilter NoChildDataSet { get { return NoChildDataSetJsonFilter.Singleton; } }
/// <summary>
/// Gets the filter which contains primary key values only.
/// </summary>
public static JsonFilter PrimaryKeyOnly { get { return PrimaryKeyOnlyJsonFilter.Singleton; } }
/// <summary>
/// Creates a filter explicitly.
/// </summary>
/// <param name="members">The model members included for JSON serialization.</param>
/// <returns>The created filter.</returns>
public static JsonFilter Explicit(params ModelMember[] members)
{
return new ExplicitMembersJsonFilter(Verify(members, nameof(members)));
}
/// <summary>
/// Joins multiple filters into a single filter.
/// </summary>
/// <param name="filters">The multiple filters.</param>
/// <returns>The result single filter.</returns>
public static JsonFilter Join(params JsonFilter[] filters)
{
filters.VerifyNotNull(nameof(filters));
for (int i = 0; i < filters.Length; i++)
{
if (filters[i] == null)
throw new ArgumentNullException(string.Format("{0}.[{1}]", nameof(filters), i));
}
return new JoinedJsonFilter(filters);
}
private static HashSet<T> Verify<T>(T[] items, string paramName)
where T : class
{
items.VerifyNotNull(paramName);
var result = new HashSet<T>();
for (int i = 0; i < items.Length; i++)
{
var item = items[i];
if (item == null)
throw new ArgumentNullException(string.Format("{0}.[{1}]", paramName, i));
if (!result.Contains(item))
result.Add(item);
}
return result;
}
/// <summary>
/// Determines whether specified model member should be serialized.
/// </summary>
/// <param name="member">The specified model member.</param>
/// <returns><see langword="true"/> if specified model member should be serialized, otherwise <see langword="false"/>.</returns>
protected internal abstract bool ShouldSerialize(ModelMember member);
private sealed class NoProjectionJsonFilter : JsonFilter
{
public static readonly NoProjectionJsonFilter Singleton = new NoProjectionJsonFilter();
private NoProjectionJsonFilter()
{
}
protected internal override bool ShouldSerialize(ModelMember member)
{
return !(member is Projection);
}
}
private sealed class NoChildDataSetJsonFilter : JsonFilter
{
public static readonly NoChildDataSetJsonFilter Singleton = new NoChildDataSetJsonFilter();
private NoChildDataSetJsonFilter()
{
}
protected internal override bool ShouldSerialize(ModelMember member)
{
var model = member as Model;
return model == null;
}
}
private sealed class PrimaryKeyOnlyJsonFilter : JsonFilter
{
public static readonly PrimaryKeyOnlyJsonFilter Singleton = new PrimaryKeyOnlyJsonFilter();
private PrimaryKeyOnlyJsonFilter()
{
}
protected internal override bool ShouldSerialize(ModelMember member)
{
return member is Column column && column.IsPrimaryKey;
}
}
private sealed class ExplicitMembersJsonFilter : JsonFilter
{
public ExplicitMembersJsonFilter(HashSet<ModelMember> members)
{
Debug.Assert(members != null);
_members = members;
}
private readonly HashSet<ModelMember> _members;
protected internal override bool ShouldSerialize(ModelMember member)
{
return _members.Contains(member);
}
}
private sealed class JoinedJsonFilter : JsonFilter
{
public JoinedJsonFilter(JsonFilter[] filters)
{
Debug.Assert(filters != null);
_filters = filters;
}
private readonly JsonFilter[] _filters;
protected internal override bool ShouldSerialize(ModelMember member)
{
for (int i = 0; i < _filters.Length; i++)
{
if (!_filters[i].ShouldSerialize(member))
return false;
}
return true;
}
}
}
}