@@ -34,7 +34,7 @@ protected ResourceIdentityAdapter(IResourceGraph resourceGraph, IResourceFactory
34
34
ArgumentGuard . NotNull ( state , nameof ( state ) ) ;
35
35
36
36
ResourceType resourceType = ResolveType ( identity , requirements , state ) ;
37
- IIdentifiable resource = CreateResource ( identity , requirements , resourceType . ClrType , state ) ;
37
+ IIdentifiable resource = CreateResource ( identity , requirements , resourceType , state ) ;
38
38
39
39
return ( resource , resourceType ) ;
40
40
}
@@ -80,7 +80,7 @@ private static void AssertIsCompatibleResourceType(ResourceType actual, Resource
80
80
}
81
81
}
82
82
83
- private IIdentifiable CreateResource ( IResourceIdentity identity , ResourceIdentityRequirements requirements , Type resourceClrType ,
83
+ private IIdentifiable CreateResource ( IResourceIdentity identity , ResourceIdentityRequirements requirements , ResourceType resourceType ,
84
84
RequestAdapterState state )
85
85
{
86
86
if ( state . Request . Kind != EndpointKind . AtomicOperations )
@@ -99,10 +99,20 @@ private IIdentifiable CreateResource(IResourceIdentity identity, ResourceIdentit
99
99
AssertHasNoId ( identity , state ) ;
100
100
}
101
101
102
+ if ( requirements . VersionConstraint == JsonElementConstraint . Required )
103
+ {
104
+ AssertHasVersion ( identity , state ) ;
105
+ }
106
+ else if ( ! resourceType . IsVersioned || requirements . VersionConstraint == JsonElementConstraint . Forbidden )
107
+ {
108
+ AssertHasNoVersion ( identity , state ) ;
109
+ }
110
+
102
111
AssertSameIdValue ( identity , requirements . IdValue , state ) ;
103
112
AssertSameLidValue ( identity , requirements . LidValue , state ) ;
113
+ AssertSameVersionValue ( identity , requirements . VersionValue , state ) ;
104
114
105
- IIdentifiable resource = _resourceFactory . CreateInstance ( resourceClrType ) ;
115
+ IIdentifiable resource = _resourceFactory . CreateInstance ( resourceType . ClrType ) ;
106
116
AssignStringId ( identity , resource , state ) ;
107
117
resource . LocalId = identity . Lid ;
108
118
resource . SetVersion ( identity . Version ) ;
@@ -159,6 +169,23 @@ private static void AssertHasNoId(IResourceIdentity identity, RequestAdapterStat
159
169
}
160
170
}
161
171
172
+ private static void AssertHasVersion ( IResourceIdentity identity , RequestAdapterState state )
173
+ {
174
+ if ( identity . Version == null )
175
+ {
176
+ throw new ModelConversionException ( state . Position , "The 'version' element is required." , null ) ;
177
+ }
178
+ }
179
+
180
+ private static void AssertHasNoVersion ( IResourceIdentity identity , RequestAdapterState state )
181
+ {
182
+ if ( identity . Version != null )
183
+ {
184
+ using IDisposable _ = state . Position . PushElement ( "version" ) ;
185
+ throw new ModelConversionException ( state . Position , "Unexpected 'version' element." , null ) ;
186
+ }
187
+ }
188
+
162
189
private static void AssertSameIdValue ( IResourceIdentity identity , string ? expected , RequestAdapterState state )
163
190
{
164
191
if ( expected != null && identity . Id != expected )
@@ -181,6 +208,17 @@ private static void AssertSameLidValue(IResourceIdentity identity, string? expec
181
208
}
182
209
}
183
210
211
+ private static void AssertSameVersionValue ( IResourceIdentity identity , string ? expected , RequestAdapterState state )
212
+ {
213
+ if ( expected != null && identity . Version != expected )
214
+ {
215
+ using IDisposable _ = state . Position . PushElement ( "version" ) ;
216
+
217
+ throw new ModelConversionException ( state . Position , "Conflicting 'version' values found." ,
218
+ $ "Expected '{ expected } ' instead of '{ identity . Version } '.", HttpStatusCode . Conflict ) ;
219
+ }
220
+ }
221
+
184
222
private void AssignStringId ( IResourceIdentity identity , IIdentifiable resource , RequestAdapterState state )
185
223
{
186
224
if ( identity . Id != null )
0 commit comments