2
2
using System . Collections . Generic ;
3
3
using System . Runtime . Serialization ;
4
4
using System . Security ;
5
- using System . Security . Permissions ;
6
5
using NHibernate . Util ;
7
6
8
7
namespace NHibernate . Engine
9
8
{
10
9
/// <summary> A contract for defining the aspects of cascading various persistence actions. </summary>
11
10
/// <seealso cref="CascadingAction"/>
12
11
[ Serializable ]
13
- public abstract class CascadeStyle
12
+ public abstract class CascadeStyle : ISerializable
14
13
{
15
14
/// <summary> package-protected constructor</summary>
16
15
internal CascadeStyle ( ) { }
@@ -29,6 +28,19 @@ static CascadeStyle()
29
28
Styles [ "remove" ] = Delete ; // adds remove as a sort-of alias for delete...
30
29
Styles [ "delete-orphan" ] = DeleteOrphan ;
31
30
Styles [ "none" ] = None ;
31
+
32
+ AliasByStyle [ All ] = "all" ;
33
+ AliasByStyle [ AllDeleteOrphan ] = "all-delete-orphan" ;
34
+ AliasByStyle [ Update ] = "save-update" ;
35
+ AliasByStyle [ Persist ] = "persist" ;
36
+ AliasByStyle [ Merge ] = "merge" ;
37
+ AliasByStyle [ Lock ] = "lock" ;
38
+ AliasByStyle [ Refresh ] = "refresh" ;
39
+ AliasByStyle [ Replicate ] = "replicate" ;
40
+ AliasByStyle [ Evict ] = "evict" ;
41
+ AliasByStyle [ Delete ] = "delete" ;
42
+ AliasByStyle [ DeleteOrphan ] = "delete-orphan" ;
43
+ AliasByStyle [ None ] = "none" ;
32
44
}
33
45
34
46
#region The CascadeStyle contract
@@ -66,7 +78,8 @@ public virtual bool HasOrphanDelete
66
78
67
79
#region Static helper methods
68
80
69
- internal static readonly Dictionary < string , CascadeStyle > Styles = new Dictionary < string , CascadeStyle > ( ) ;
81
+ private static readonly Dictionary < string , CascadeStyle > Styles = new Dictionary < string , CascadeStyle > ( ) ;
82
+ private static readonly Dictionary < CascadeStyle , string > AliasByStyle = new Dictionary < CascadeStyle , string > ( ) ;
70
83
71
84
/// <summary> Factory method for obtaining named cascade styles </summary>
72
85
/// <param name="cascade">The named cascade style name. </param>
@@ -80,53 +93,43 @@ public static CascadeStyle GetCascadeStyle(string cascade)
80
93
return style ;
81
94
}
82
95
83
- private static void RunTypeConstructor ( )
96
+ void ISerializable . GetObjectData ( SerializationInfo info , StreamingContext context )
84
97
{
85
- // No code needed.
98
+ string alias = AliasByStyle [ this ] ;
99
+ info . SetType ( typeof ( CascadeStyleSingletonReference ) ) ;
100
+ info . AddValue ( "cascadestyle" , alias , typeof ( string ) ) ;
86
101
}
87
102
88
- #endregion
89
-
90
- #region The CascadeStyle implementations
91
-
92
103
[ Serializable ]
93
- private abstract class SingletonCascadeStyle < TConcrete > : CascadeStyle , ISerializable
94
- where TConcrete : class , new ( )
104
+ private sealed class CascadeStyleSingletonReference : IObjectReference , ISerializable
95
105
{
96
- public static readonly TConcrete Instance = new TConcrete ( ) ;
106
+ private readonly string _cascadeStyle ;
97
107
98
- #if NET_4_0
99
- [ SecurityCritical ]
100
- #else
101
- [ SecurityPermission ( SecurityAction . LinkDemand , Flags = SecurityPermissionFlag . SerializationFormatter ) ]
102
- #endif
103
- public void GetObjectData ( SerializationInfo info , StreamingContext context )
108
+ void ISerializable . GetObjectData ( SerializationInfo info , StreamingContext context )
104
109
{
105
- // Don't serialize the real object, that could cause multiple objects of the same
106
- // singleton type after deserialization.
107
- info . SetType ( typeof ( CascadeStyleReference ) ) ;
110
+ throw new NotImplementedException ( "This class should not be serialized directly." ) ;
108
111
}
109
112
110
- [ Serializable ]
111
- private sealed class CascadeStyleReference : IObjectReference
113
+ private CascadeStyleSingletonReference ( SerializationInfo info , StreamingContext context )
112
114
{
113
- #if NET_4_0
114
- [ SecurityCritical ]
115
- #endif
116
- public Object GetRealObject ( StreamingContext context )
117
- {
118
- // First make sure that the type constructor of the base class was already executed.
119
- // If this isn't the case 'Instance' can't be constructed and will stay null.
120
- CascadeStyle . RunTypeConstructor ( ) ;
115
+ _cascadeStyle = ( string ) info . GetValue ( "cascadestyle" , typeof ( string ) ) ;
116
+ }
121
117
122
- // Return the singleton instance of this CascadeStyle.
123
- return Instance ;
124
- }
118
+ [ SecurityCritical ]
119
+ Object IObjectReference . GetRealObject ( StreamingContext context )
120
+ {
121
+ // Redirect to the singleton instance for the correct cascade style.
122
+ return GetCascadeStyle ( _cascadeStyle ) ;
125
123
}
126
124
}
127
125
126
+ #endregion
127
+
128
+ #region The CascadeStyle implementations
129
+
130
+
128
131
[ Serializable ]
129
- private class AllDeleteOrphanCascadeStyle : SingletonCascadeStyle < AllDeleteOrphanCascadeStyle >
132
+ private class AllDeleteOrphanCascadeStyle : CascadeStyle
130
133
{
131
134
public override bool DoCascade ( CascadingAction action )
132
135
{
@@ -139,7 +142,7 @@ public override bool HasOrphanDelete
139
142
}
140
143
141
144
[ Serializable ]
142
- private class AllCascadeStyle : SingletonCascadeStyle < AllCascadeStyle >
145
+ private class AllCascadeStyle : CascadeStyle
143
146
{
144
147
public override bool DoCascade ( CascadingAction action )
145
148
{
@@ -148,7 +151,7 @@ public override bool DoCascade(CascadingAction action)
148
151
}
149
152
150
153
[ Serializable ]
151
- private class UpdateCascadeStyle : SingletonCascadeStyle < UpdateCascadeStyle >
154
+ private class UpdateCascadeStyle : CascadeStyle
152
155
{
153
156
public override bool DoCascade ( CascadingAction action )
154
157
{
@@ -157,7 +160,7 @@ public override bool DoCascade(CascadingAction action)
157
160
}
158
161
159
162
[ Serializable ]
160
- private class LockCascadeStyle : SingletonCascadeStyle < LockCascadeStyle >
163
+ private class LockCascadeStyle : CascadeStyle
161
164
{
162
165
public override bool DoCascade ( CascadingAction action )
163
166
{
@@ -166,7 +169,7 @@ public override bool DoCascade(CascadingAction action)
166
169
}
167
170
168
171
[ Serializable ]
169
- private class RefreshCascadeStyle : SingletonCascadeStyle < RefreshCascadeStyle >
172
+ private class RefreshCascadeStyle : CascadeStyle
170
173
{
171
174
public override bool DoCascade ( CascadingAction action )
172
175
{
@@ -175,7 +178,7 @@ public override bool DoCascade(CascadingAction action)
175
178
}
176
179
177
180
[ Serializable ]
178
- private class EvictCascadeStyle : SingletonCascadeStyle < EvictCascadeStyle >
181
+ private class EvictCascadeStyle : CascadeStyle
179
182
{
180
183
public override bool DoCascade ( CascadingAction action )
181
184
{
@@ -184,7 +187,7 @@ public override bool DoCascade(CascadingAction action)
184
187
}
185
188
186
189
[ Serializable ]
187
- private class ReplicateCascadeStyle : SingletonCascadeStyle < ReplicateCascadeStyle >
190
+ private class ReplicateCascadeStyle : CascadeStyle
188
191
{
189
192
public override bool DoCascade ( CascadingAction action )
190
193
{
@@ -193,7 +196,7 @@ public override bool DoCascade(CascadingAction action)
193
196
}
194
197
195
198
[ Serializable ]
196
- private class MergeCascadeStyle : SingletonCascadeStyle < MergeCascadeStyle >
199
+ private class MergeCascadeStyle : CascadeStyle
197
200
{
198
201
public override bool DoCascade ( CascadingAction action )
199
202
{
@@ -202,7 +205,7 @@ public override bool DoCascade(CascadingAction action)
202
205
}
203
206
204
207
[ Serializable ]
205
- private class PersistCascadeStyle : SingletonCascadeStyle < PersistCascadeStyle >
208
+ private class PersistCascadeStyle : CascadeStyle
206
209
{
207
210
public override bool DoCascade ( CascadingAction action )
208
211
{
@@ -211,7 +214,7 @@ public override bool DoCascade(CascadingAction action)
211
214
}
212
215
213
216
[ Serializable ]
214
- private class DeleteCascadeStyle : SingletonCascadeStyle < DeleteCascadeStyle >
217
+ private class DeleteCascadeStyle : CascadeStyle
215
218
{
216
219
public override bool DoCascade ( CascadingAction action )
217
220
{
@@ -220,7 +223,7 @@ public override bool DoCascade(CascadingAction action)
220
223
}
221
224
222
225
[ Serializable ]
223
- private class DeleteOrphanCascadeStyle : SingletonCascadeStyle < DeleteOrphanCascadeStyle >
226
+ private class DeleteOrphanCascadeStyle : CascadeStyle
224
227
{
225
228
public override bool DoCascade ( CascadingAction action )
226
229
{
@@ -239,7 +242,7 @@ public override bool HasOrphanDelete
239
242
}
240
243
241
244
[ Serializable ]
242
- private class NoneCascadeStyle : SingletonCascadeStyle < NoneCascadeStyle >
245
+ private class NoneCascadeStyle : CascadeStyle
243
246
{
244
247
public override bool DoCascade ( CascadingAction action )
245
248
{
@@ -248,14 +251,24 @@ public override bool DoCascade(CascadingAction action)
248
251
}
249
252
250
253
[ Serializable ]
251
- public sealed class MultipleCascadeStyle : CascadeStyle
254
+ public sealed class MultipleCascadeStyle : CascadeStyle , ISerializable
252
255
{
253
256
private readonly CascadeStyle [ ] styles ;
254
257
public MultipleCascadeStyle ( CascadeStyle [ ] styles )
255
258
{
256
259
this . styles = styles ;
257
260
}
258
261
262
+ private MultipleCascadeStyle ( SerializationInfo info , StreamingContext context )
263
+ {
264
+ styles = ( CascadeStyle [ ] ) info . GetValue ( "styles" , typeof ( CascadeStyle [ ] ) ) ;
265
+ }
266
+
267
+ void ISerializable . GetObjectData ( SerializationInfo info , StreamingContext context )
268
+ {
269
+ info . AddValue ( "styles" , styles ) ;
270
+ }
271
+
259
272
public override bool DoCascade ( CascadingAction action )
260
273
{
261
274
for ( int i = 0 ; i < styles . Length ; i ++ )
@@ -295,40 +308,40 @@ public override string ToString()
295
308
}
296
309
297
310
/// <summary> save / delete / update / evict / lock / replicate / merge / persist + delete orphans</summary>
298
- public static readonly CascadeStyle AllDeleteOrphan = AllDeleteOrphanCascadeStyle . Instance ;
311
+ public static readonly CascadeStyle AllDeleteOrphan = new AllDeleteOrphanCascadeStyle ( ) ;
299
312
300
313
/// <summary> save / delete / update / evict / lock / replicate / merge / persist</summary>
301
- public static readonly CascadeStyle All = AllCascadeStyle . Instance ;
314
+ public static readonly CascadeStyle All = new AllCascadeStyle ( ) ;
302
315
303
316
/// <summary> save / update</summary>
304
- public static readonly CascadeStyle Update = UpdateCascadeStyle . Instance ;
317
+ public static readonly CascadeStyle Update = new UpdateCascadeStyle ( ) ;
305
318
306
319
/// <summary> lock</summary>
307
- public static readonly CascadeStyle Lock = LockCascadeStyle . Instance ;
320
+ public static readonly CascadeStyle Lock = new LockCascadeStyle ( ) ;
308
321
309
322
/// <summary> refresh</summary>
310
- public static readonly CascadeStyle Refresh = RefreshCascadeStyle . Instance ;
323
+ public static readonly CascadeStyle Refresh = new RefreshCascadeStyle ( ) ;
311
324
312
325
/// <summary> evict</summary>
313
- public static readonly CascadeStyle Evict = EvictCascadeStyle . Instance ;
326
+ public static readonly CascadeStyle Evict = new EvictCascadeStyle ( ) ;
314
327
315
328
/// <summary> replicate</summary>
316
- public static readonly CascadeStyle Replicate = ReplicateCascadeStyle . Instance ;
329
+ public static readonly CascadeStyle Replicate = new ReplicateCascadeStyle ( ) ;
317
330
318
331
/// <summary> merge</summary>
319
- public static readonly CascadeStyle Merge = MergeCascadeStyle . Instance ;
332
+ public static readonly CascadeStyle Merge = new MergeCascadeStyle ( ) ;
320
333
321
334
/// <summary> create</summary>
322
- public static readonly CascadeStyle Persist = PersistCascadeStyle . Instance ;
335
+ public static readonly CascadeStyle Persist = new PersistCascadeStyle ( ) ;
323
336
324
337
/// <summary> delete</summary>
325
- public static readonly CascadeStyle Delete = DeleteCascadeStyle . Instance ;
338
+ public static readonly CascadeStyle Delete = new DeleteCascadeStyle ( ) ;
326
339
327
340
/// <summary> delete + delete orphans</summary>
328
- public static readonly CascadeStyle DeleteOrphan = DeleteOrphanCascadeStyle . Instance ;
341
+ public static readonly CascadeStyle DeleteOrphan = new DeleteOrphanCascadeStyle ( ) ;
329
342
330
343
/// <summary> no cascades</summary>
331
- public static readonly CascadeStyle None = NoneCascadeStyle . Instance ;
344
+ public static readonly CascadeStyle None = new NoneCascadeStyle ( ) ;
332
345
333
346
#endregion
334
347
}
0 commit comments