*/
package org.opendaylight.mdsal.binding.dom.adapter;
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Verify.verifyNotNull;
import static java.util.Objects.requireNonNull;
+import static org.opendaylight.mdsal.binding.dom.adapter.StaticConfiguration.ENABLE_CODEC_SHORTCUT;
import com.google.common.util.concurrent.ListenableFuture;
import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingLazyContainerNode;
import org.opendaylight.mdsal.dom.api.DOMRpcIdentifier;
import org.opendaylight.mdsal.dom.api.DOMRpcImplementation;
import org.opendaylight.mdsal.dom.api.DOMRpcResult;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
abstract sealed class AbstractDOMRpcImplementationAdapter implements DOMRpcImplementation
permits BindingDOMRpcImplementationAdapter, LegacyDOMRpcImplementationAdapter {
private final AdapterContext adapterContext;
+ private final @NonNull QName inputName;
- AbstractDOMRpcImplementationAdapter(final AdapterContext adapterContext) {
+ AbstractDOMRpcImplementationAdapter(final AdapterContext adapterContext, @NonNull QName inputName) {
this.adapterContext = requireNonNull(adapterContext);
+ this.inputName = requireNonNull(inputName);
}
@Override
return LazyDOMRpcResultFuture.create(serializer, invokeRpc(serializer, rpc, input));
}
- abstract @NonNull ListenableFuture<RpcResult<?>> invokeRpc(CurrentAdapterSerializer serializer,
- DOMRpcIdentifier rpc, ContainerNode input);
+ abstract @NonNull ListenableFuture<RpcResult<?>> invokeRpc(@NonNull CurrentAdapterSerializer serializer,
+ @NonNull DOMRpcIdentifier rpc, @NonNull ContainerNode input);
+
+ final @NonNull DataObject deserialize(final @NonNull CurrentAdapterSerializer serializer,
+ final @NonNull QName rpcName, final @NonNull ContainerNode input) {
+ if (ENABLE_CODEC_SHORTCUT && input instanceof BindingLazyContainerNode<?> lazy) {
+ return lazy.getDataObject();
+ }
+
+ // TODO: this is a bit inefficient: typically we get the same CurrentAdapterSerializer and the path is also
+ // constant, hence we should be able to cache this lookup and just have the appropriate
+ // BindingDataObjectCodecTreeNode and reuse it directly
+ checkArgument(inputName.equals(input.getIdentifier().getNodeType()),
+ "Unexpected RPC %s input %s", rpcName, input);
+ // TODO: this is a bit inefficient: typically we get the same CurrentAdapterSerializer and the path is also
+ // constant, hence we should be able to cache this lookup and just have the appropriate
+ // BindingDataObjectCodecTreeNode and reuse it directly
+ // FIXME: should be a guaranteed return, as innput is @NonNull
+ return verifyNotNull(serializer.fromNormalizedNodeRpcData(Absolute.of(rpcName, inputName), input));
+ }
}
*/
package org.opendaylight.mdsal.binding.dom.adapter;
-import static com.google.common.base.Preconditions.checkArgument;
import static java.util.Objects.requireNonNull;
-import static org.opendaylight.mdsal.binding.dom.adapter.StaticConfiguration.ENABLE_CODEC_SHORTCUT;
import com.google.common.util.concurrent.ListenableFuture;
import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingLazyContainerNode;
import org.opendaylight.mdsal.dom.api.DOMRpcIdentifier;
-import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.Rpc;
import org.opendaylight.yangtools.yang.binding.RpcInput;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.YangConstants;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
final class BindingDOMRpcImplementationAdapter extends AbstractDOMRpcImplementationAdapter {
private final @NonNull Rpc<?, ?> delegate;
private final @NonNull QName rpcName;
- private final @NonNull QName inputName;
BindingDOMRpcImplementationAdapter(final AdapterContext adapterContext, final Rpc<?, ?> delegate,
final QName rpcName) {
- super(adapterContext);
+ super(adapterContext, YangConstants.operationInputQName(rpcName.getModule()).intern());
this.delegate = requireNonNull(delegate);
this.rpcName = requireNonNull(rpcName);
- inputName = YangConstants.operationInputQName(rpcName.getModule()).intern();
}
@Override
ListenableFuture<RpcResult<?>> invokeRpc(final CurrentAdapterSerializer serializer, final DOMRpcIdentifier rpc,
final ContainerNode input) {
- final var bindingInput = input != null ? deserialize(serializer, input) : null;
+ final var bindingInput = input != null ? deserialize(serializer, rpcName, input) : null;
return ((Rpc) delegate).invoke((RpcInput) bindingInput);
}
-
- private DataObject deserialize(final CurrentAdapterSerializer serializer, final ContainerNode input) {
- if (ENABLE_CODEC_SHORTCUT && input instanceof BindingLazyContainerNode<?> lazy) {
- return lazy.getDataObject();
- }
-
- // TODO: this is a bit inefficient: typically we get the same CurrentAdapterSerializer and the path is also
- // constant, hence we should be able to cache this lookup and just have the appropriate
- // BindingDataObjectCodecTreeNode and reuse it directly
- checkArgument(inputName.equals(input.getIdentifier().getNodeType()),
- "Unexpected RPC %s input %s", rpcName, input);
- return serializer.fromNormalizedNodeRpcData(Absolute.of(rpcName, inputName), input);
- }
}
*/
package org.opendaylight.mdsal.binding.dom.adapter;
-import static com.google.common.base.Preconditions.checkArgument;
import static java.util.Objects.requireNonNull;
-import static org.opendaylight.mdsal.binding.dom.adapter.StaticConfiguration.ENABLE_CODEC_SHORTCUT;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.opendaylight.mdsal.binding.dom.adapter.invoke.RpcServiceInvoker;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingLazyContainerNode;
import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
import org.opendaylight.mdsal.dom.api.DOMRpcIdentifier;
-import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.RpcService;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.YangConstants;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
@Deprecated(since = "11.0.0", forRemoval = true)
final class LegacyDOMRpcImplementationAdapter<T extends RpcService> extends AbstractDOMRpcImplementationAdapter {
private final RpcServiceInvoker invoker;
private final T delegate;
- private final QName inputQname;
LegacyDOMRpcImplementationAdapter(final AdapterContext adapterContext, final Class<T> type,
final Map<QName, Method> localNameToMethod, final T delegate) {
- super(adapterContext);
+ // FIXME: do not use BindingReflections here
+ super(adapterContext, YangConstants.operationInputQName(BindingReflections.getQNameModule(type)).intern());
try {
invoker = SERVICE_INVOKERS.get(type, () -> RpcServiceInvoker.from(localNameToMethod));
}
this.delegate = requireNonNull(delegate);
- inputQname = YangConstants.operationInputQName(BindingReflections.getQNameModule(type)).intern();
}
@Override
ListenableFuture<RpcResult<?>> invokeRpc(final CurrentAdapterSerializer serializer, final DOMRpcIdentifier rpc,
final ContainerNode input) {
final QName rpcType = rpc.getType();
- final DataObject bindingInput = input != null ? deserialize(serializer, rpcType, input) : null;
+ final var bindingInput = input != null ? deserialize(serializer, rpcType, input) : null;
return invoker.invokeRpc(delegate, rpcType, bindingInput);
}
-
- private DataObject deserialize(final CurrentAdapterSerializer serializer, final QName rpcType,
- final ContainerNode input) {
- if (ENABLE_CODEC_SHORTCUT && input instanceof BindingLazyContainerNode) {
- return ((BindingLazyContainerNode<?>) input).getDataObject();
- }
-
- checkArgument(inputQname.equals(input.getIdentifier().getNodeType()),
- "Unexpected RPC %s input %s", rpcType, input);
- return serializer.fromNormalizedNodeRpcData(Absolute.of(rpcType, inputQname), input);
- }
}