@@ -33,7 +33,7 @@ protected ResourceIdentityAdapter(IResourceGraph resourceGraph, IResourceFactory
33
33
ArgumentGuard . NotNull ( state , nameof ( state ) ) ;
34
34
35
35
ResourceType resourceType = ResolveType ( identity , requirements , state ) ;
36
- IIdentifiable resource = CreateResource ( identity , requirements , resourceType . ClrType , state ) ;
36
+ IIdentifiable resource = CreateResource ( identity , requirements , resourceType , state ) ;
37
37
38
38
return ( resource , resourceType ) ;
39
39
}
@@ -93,7 +93,8 @@ private static void AssertIsCompatibleResourceType(ResourceType actual, Resource
93
93
}
94
94
}
95
95
96
- private IIdentifiable CreateResource ( IResourceIdentity identity , ResourceIdentityRequirements requirements , Type resourceClrType , RequestAdapterState state )
96
+ private IIdentifiable CreateResource ( IResourceIdentity identity , ResourceIdentityRequirements requirements , ResourceType resourceType ,
97
+ RequestAdapterState state )
97
98
{
98
99
if ( state . Request . Kind != EndpointKind . AtomicOperations )
99
100
{
@@ -111,10 +112,20 @@ private IIdentifiable CreateResource(IResourceIdentity identity, ResourceIdentit
111
112
AssertHasNoId ( identity , state ) ;
112
113
}
113
114
115
+ if ( requirements . VersionConstraint == JsonElementConstraint . Required )
116
+ {
117
+ AssertHasVersion ( identity , state ) ;
118
+ }
119
+ else if ( ! resourceType . IsVersioned || requirements . VersionConstraint == JsonElementConstraint . Forbidden )
120
+ {
121
+ AssertHasNoVersion ( identity , state ) ;
122
+ }
123
+
114
124
AssertSameIdValue ( identity , requirements . IdValue , state ) ;
115
125
AssertSameLidValue ( identity , requirements . LidValue , state ) ;
126
+ AssertSameVersionValue ( identity , requirements . VersionValue , state ) ;
116
127
117
- IIdentifiable resource = _resourceFactory . CreateInstance ( resourceClrType ) ;
128
+ IIdentifiable resource = _resourceFactory . CreateInstance ( resourceType . ClrType ) ;
118
129
AssignStringId ( identity , resource , state ) ;
119
130
resource . LocalId = identity . Lid ;
120
131
resource . SetVersion ( identity . Version ) ;
@@ -171,6 +182,23 @@ private static void AssertHasNoId(IResourceIdentity identity, RequestAdapterStat
171
182
}
172
183
}
173
184
185
+ private static void AssertHasVersion ( IResourceIdentity identity , RequestAdapterState state )
186
+ {
187
+ if ( identity . Version == null )
188
+ {
189
+ throw new ModelConversionException ( state . Position , "The 'version' element is required." , null ) ;
190
+ }
191
+ }
192
+
193
+ private static void AssertHasNoVersion ( IResourceIdentity identity , RequestAdapterState state )
194
+ {
195
+ if ( identity . Version != null )
196
+ {
197
+ using IDisposable _ = state . Position . PushElement ( "version" ) ;
198
+ throw new ModelConversionException ( state . Position , "Unexpected 'version' element." , null ) ;
199
+ }
200
+ }
201
+
174
202
private static void AssertSameIdValue ( IResourceIdentity identity , string ? expected , RequestAdapterState state )
175
203
{
176
204
if ( expected != null && identity . Id != expected )
@@ -193,6 +221,17 @@ private static void AssertSameLidValue(IResourceIdentity identity, string? expec
193
221
}
194
222
}
195
223
224
+ private static void AssertSameVersionValue ( IResourceIdentity identity , string ? expected , RequestAdapterState state )
225
+ {
226
+ if ( expected != null && identity . Version != expected )
227
+ {
228
+ using IDisposable _ = state . Position . PushElement ( "version" ) ;
229
+
230
+ throw new ModelConversionException ( state . Position , "Conflicting 'version' values found." , $ "Expected '{ expected } ' instead of '{ identity . Version } '.",
231
+ HttpStatusCode . Conflict ) ;
232
+ }
233
+ }
234
+
196
235
private void AssignStringId ( IResourceIdentity identity , IIdentifiable resource , RequestAdapterState state )
197
236
{
198
237
if ( identity . Id != null )
0 commit comments