+ /**
+ * Validates whether keys in {@code payload} are equal to values of keys in {@code iiWithData} for list schema node
+ *
+ * @throws RestconfDocumentedException
+ * if key values or key count in payload and URI isn't equal
+ *
+ */
+ private void validateListKeysEqualityInPayloadAndUri(final InstanceIdWithSchemaNode iiWithData,
+ final CompositeNode payload) {
+ if (iiWithData.getSchemaNode() instanceof ListSchemaNode) {
+ final List<QName> keyDefinitions = ((ListSchemaNode) iiWithData.getSchemaNode()).getKeyDefinition();
+ final PathArgument lastPathArgument = iiWithData.getInstanceIdentifier().getLastPathArgument();
+ if (lastPathArgument instanceof NodeIdentifierWithPredicates) {
+ final Map<QName, Object> uriKeyValues = ((NodeIdentifierWithPredicates) lastPathArgument)
+ .getKeyValues();
+ isEqualUriAndPayloadKeyValues(uriKeyValues, payload, keyDefinitions);
+ }
+ }
+ }
+
+ private void isEqualUriAndPayloadKeyValues(final Map<QName, Object> uriKeyValues, final CompositeNode payload,
+ final List<QName> keyDefinitions) {
+ for (QName keyDefinition : keyDefinitions) {
+ final Object uriKeyValue = uriKeyValues.get(keyDefinition);
+ // should be caught during parsing URI to InstanceIdentifier
+ if (uriKeyValue == null) {
+ throw new RestconfDocumentedException("Missing key " + keyDefinition + " in URI.", ErrorType.PROTOCOL,
+ ErrorTag.DATA_MISSING);
+ }
+ final List<SimpleNode<?>> payloadKeyValues = payload.getSimpleNodesByName(keyDefinition.getLocalName());
+ if (payloadKeyValues.isEmpty()) {
+ throw new RestconfDocumentedException("Missing key " + keyDefinition.getLocalName()
+ + " in the message body.", ErrorType.PROTOCOL, ErrorTag.DATA_MISSING);
+ }
+
+ Object payloadKeyValue = payloadKeyValues.iterator().next().getValue();
+ if (!uriKeyValue.equals(payloadKeyValue)) {
+ throw new RestconfDocumentedException("The value '" + uriKeyValue + "' for key '"
+ + keyDefinition.getLocalName() + "' specified in the URI doesn't match the value '"
+ + payloadKeyValue + "' specified in the message body. ", ErrorType.PROTOCOL,
+ ErrorTag.INVALID_VALUE);
+ }
+ }
+ }
+