import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
if (typedef instanceof InstanceIdentifierTypeDefinition) {
return toInstanceIdentifier(value, schemaNode);
}
+ if (typedef instanceof UnionTypeDefinition union) {
+ return toUnion(stack, schemaNode, union, value);
+ }
// Simple types
final var codec = verifyNotNull(TypeDefinitionAwareCodec.from(typedef), "Unhandled type %s decoding %s",
keyValues.get(0)));
}
+ private Object toUnion(final SchemaInferenceStack stack, final TypedDataSchemaNode schemaNode,
+ final UnionTypeDefinition union, final @NonNull String value) {
+ // As per https://www.rfc-editor.org/rfc/rfc7950#section-9.12:
+ // 'type union' must have at least one 'type'
+ // hence this variable will always end up being non-null before being used
+ RestconfDocumentedException cause = null;
+ for (var type : union.getTypes()) {
+ try {
+ return prepareValueByType(stack, schemaNode, type, value);
+ } catch (RestconfDocumentedException e) {
+ if (cause == null) {
+ cause = e;
+ } else {
+ cause.addSuppressed(e);
+ }
+ }
+ }
+ throw new RestconfDocumentedException("Invalid value '" + value + "' for " + schemaNode.getQName(),
+ ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE, cause);
+ }
+
private YangInstanceIdentifier toInstanceIdentifier(final String value, final TypedDataSchemaNode schemaNode) {
if (value.isEmpty() || !value.startsWith("/")) {
throw new RestconfDocumentedException("Invalid value '" + value + "' for " + schemaNode.getQName(),
import static org.junit.jupiter.api.Assertions.assertThrows;
import java.text.ParseException;
-import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.opendaylight.restconf.api.ApiPath;
import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
}
@Test
- @Disabled("relies on TypeDefinitionAwareCodec's union handling")
void unionKeyInstanceIdentifier() {
assertNormalized(YangInstanceIdentifier.builder()
.node(XYZZY)
.build(), "nc1265:xyzzy=%2Fnc1265:baz=123");
}
+ @Test
+ void unionKeyIdentityref() {
+ assertNormalized(YangInstanceIdentifier.builder()
+ .node(XYZZY)
+ .nodeWithKey(XYZZY, KEY, QName.create("nc1265", "base-id"))
+ .build(), "nc1265:xyzzy=nc1265:base-id");
+ }
+
+ @Test
+ void unionKeyLeafref() {
+ assertNormalized(YangInstanceIdentifier.builder()
+ .node(XYZZY)
+ .nodeWithKey(XYZZY, KEY, Uint8.valueOf(123))
+ .build(), "nc1265:xyzzy=123");
+ }
+
+ @Test
+ void unionKeyString() {
+ assertNormalized(YangInstanceIdentifier.builder()
+ .node(XYZZY)
+ .nodeWithKey(XYZZY, KEY, "abc")
+ .build(), "nc1265:xyzzy=abc");
+ }
+
@Test
void noslashInstanceIdentifierKey() {
final var error = assertRestconfError("nc1265:bar=nc1265:baz=123");