X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=mdsal.git;a=blobdiff_plain;f=binding%2Fmdsal-binding-dom-adapter%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fdom%2Fadapter%2FCurrentAdapterSerializer.java;h=f444c1cf8e3529b135a35c5ee4b156b5eadd6320;hp=cea844371fdda9e5f6c2169c6810c74fe0e50074;hb=c3a2361f4c0de50dba3e64e066d30cfcb32776df;hpb=945d692243301314c2efb3910d6a43dbde4ec035 diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializer.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializer.java index cea844371f..f444c1cf8e 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializer.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializer.java @@ -7,7 +7,7 @@ */ package org.opendaylight.mdsal.binding.dom.adapter; -import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Verify.verify; import static com.google.common.base.Verify.verifyNotNull; import static java.util.Objects.requireNonNull; @@ -21,6 +21,7 @@ import java.lang.reflect.Method; import java.util.Collection; import java.util.stream.Collectors; import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.mdsal.binding.api.ActionSpec; import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices; import org.opendaylight.mdsal.binding.dom.codec.spi.ForwardingBindingDOMCodecServices; @@ -28,16 +29,20 @@ import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext; import org.opendaylight.mdsal.binding.spec.naming.BindingMapping; import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; -import org.opendaylight.yangtools.yang.binding.Action; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.RpcService; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.RpcDefinition; +import org.opendaylight.yangtools.yang.model.api.stmt.ActionEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.ListEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute; +import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -81,10 +86,38 @@ public final class CurrentAdapterSerializer extends ForwardingBindingDOMCodecSer return subtrees.stream().map(this::toDOMDataTreeIdentifier).collect(Collectors.toSet()); } - @NonNull Absolute getActionPath(final @NonNull Class> type) { - final Absolute identifier = getRuntimeContext().getActionIdentifier(type); - checkArgument(identifier != null, "Failed to find schema for %s", type); - return identifier; + @NonNull Absolute getActionPath(final @NonNull ActionSpec spec) { + final var stack = SchemaInferenceStack.of(getRuntimeContext().getEffectiveModelContext()); + final var it = toYangInstanceIdentifier(spec.path()).getPathArguments().iterator(); + verify(it.hasNext(), "Unexpected empty instance identifier for %s", spec); + + QNameModule lastNamespace; + do { + final var arg = it.next(); + if (arg instanceof AugmentationIdentifier) { + final var augChildren = ((AugmentationIdentifier) arg).getPossibleChildNames(); + verify(!augChildren.isEmpty(), "Invalid empty augmentation %s", arg); + lastNamespace = augChildren.iterator().next().getModule(); + continue; + } + + final var qname = arg.getNodeType(); + final var stmt = stack.enterDataTree(qname); + lastNamespace = qname.getModule(); + if (stmt instanceof ListEffectiveStatement) { + // Lists have two steps + verify(it.hasNext(), "Unexpected list termination at %s in %s", stmt, spec); + // Verify just to make sure we are doing the right thing + final var skipped = it.next(); + verify(skipped instanceof NodeIdentifier, "Unexpected skipped list entry item %s in %s", skipped, spec); + verify(stmt.argument().equals(skipped.getNodeType()), "Mismatched list entry item %s in %s", skipped, + spec); + } + } while (it.hasNext()); + + final var stmt = stack.enterSchemaTree(BindingReflections.findQName(spec.type()).bindTo(lastNamespace)); + verify(stmt instanceof ActionEffectiveStatement, "Action %s resolved to unexpected statement %s", spec, stmt); + return stack.toSchemaNodeIdentifier(); } // FIXME: This should be probably part of Binding Runtime context