From ea12e80106a48a60c9eb61e5d19def4d493c7755 Mon Sep 17 00:00:00 2001 From: Martin Ciglan Date: Mon, 6 Mar 2017 09:59:21 +0100 Subject: [PATCH 1/1] Bug 6856: Rpc definition should implicitly define input/output - corresponding patch for MDSAL - code clean-up in affected class Change-Id: I715585331496d181031f5a82ce801a1b7271c56d Signed-off-by: Martin Ciglan (cherry picked from commit e6ba71a1853e1e49affe1f9712c3c63c74028878) --- .../adapter/BindingToNormalizedNodeCodec.java | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java index c1a3e13c33..de91580e18 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java @@ -49,6 +49,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.impl.codec.DeserializationException; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; +import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; @@ -56,6 +57,8 @@ import org.opendaylight.yangtools.yang.model.api.RpcDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.SchemaContextListener; import org.opendaylight.yangtools.yang.model.api.SchemaPath; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.meta.StatementSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -72,7 +75,7 @@ public final class BindingToNormalizedNodeCodec implements BindingCodecTreeFacto .softValues().build(new CacheLoader, YangInstanceIdentifier>() { @Override - public YangInstanceIdentifier load(final InstanceIdentifier key) throws Exception { + public YangInstanceIdentifier load(@Nonnull final InstanceIdentifier key) throws Exception { return toYangInstanceIdentifierBlocking(key); } @@ -97,7 +100,7 @@ public final class BindingToNormalizedNodeCodec implements BindingCodecTreeFacto try { return codecRegistry.toYangInstanceIdentifier(binding); } catch (final MissingSchemaException e) { - waitForSchema(decompose(binding),e); + waitForSchema(decompose(binding), e); return codecRegistry.toYangInstanceIdentifier(binding); } } @@ -117,7 +120,7 @@ public final class BindingToNormalizedNodeCodec implements BindingCodecTreeFacto } @Override - public YangInstanceIdentifier toYangInstanceIdentifier(final InstanceIdentifier binding) { + public YangInstanceIdentifier toYangInstanceIdentifier(@Nonnull final InstanceIdentifier binding) { return codecRegistry.toYangInstanceIdentifier(binding); } @@ -153,33 +156,34 @@ public final class BindingToNormalizedNodeCodec implements BindingCodecTreeFacto } @Override - public Entry, DataObject> fromNormalizedNode(final YangInstanceIdentifier path, + public Entry, DataObject> fromNormalizedNode(@Nonnull final YangInstanceIdentifier path, final NormalizedNode data) { return codecRegistry.fromNormalizedNode(path, data); } @Override - public Notification fromNormalizedNodeNotification(final SchemaPath path, final ContainerNode data) { + public Notification fromNormalizedNodeNotification(@Nonnull final SchemaPath path, + @Nonnull final ContainerNode data) { return codecRegistry.fromNormalizedNodeNotification(path, data); } @Override - public DataObject fromNormalizedNodeRpcData(final SchemaPath path, final ContainerNode data) { + public DataObject fromNormalizedNodeRpcData(@Nonnull final SchemaPath path, @Nonnull final ContainerNode data) { return codecRegistry.fromNormalizedNodeRpcData(path, data); } @Override - public InstanceIdentifier fromYangInstanceIdentifier(final YangInstanceIdentifier dom) { + public InstanceIdentifier fromYangInstanceIdentifier(@Nonnull final YangInstanceIdentifier dom) { return codecRegistry.fromYangInstanceIdentifier(dom); } @Override - public ContainerNode toNormalizedNodeNotification(final Notification data) { + public ContainerNode toNormalizedNodeNotification(@Nonnull final Notification data) { return codecRegistry.toNormalizedNodeNotification(data); } @Override - public ContainerNode toNormalizedNodeRpcData(final DataContainer data) { + public ContainerNode toNormalizedNodeRpcData(@Nonnull final DataContainer data) { return codecRegistry.toNormalizedNodeRpcData(data); } @@ -195,7 +199,7 @@ public final class BindingToNormalizedNodeCodec implements BindingCodecTreeFacto public Optional> toBinding(final YangInstanceIdentifier normalized) throws DeserializationException { try { - return Optional.>fromNullable(codecRegistry.fromYangInstanceIdentifier(normalized)); + return Optional.fromNullable(codecRegistry.fromYangInstanceIdentifier(normalized)); } catch (final IllegalArgumentException e) { return Optional.absent(); } @@ -255,7 +259,7 @@ public final class BindingToNormalizedNodeCodec implements BindingCodecTreeFacto // FIXME: This should be probably part of Binding Runtime context public ImmutableBiMap getRpcMethodToSchemaPath(final Class key) { final Module module = getModuleBlocking(key); - final ImmutableBiMap.Builder ret = ImmutableBiMap.builder(); + final ImmutableBiMap.Builder ret = ImmutableBiMap.builder(); try { for (final RpcDefinition rpcDef : module.getRpcs()) { final Method method = findRpcMethod(key, rpcDef); @@ -309,13 +313,18 @@ public final class BindingToNormalizedNodeCodec implements BindingCodecTreeFacto private Method findRpcMethod(final Class key, final RpcDefinition rpcDef) throws NoSuchMethodException { final String methodName = BindingMapping.getMethodName(rpcDef.getQName()); - if(rpcDef.getInput() != null) { + if (rpcDef.getInput() != null && isExplicitStatement(rpcDef.getInput())) { final Class inputClz = runtimeContext.getClassForSchema(rpcDef.getInput()); return key.getMethod(methodName, inputClz); } return key.getMethod(methodName); } + private static boolean isExplicitStatement(final ContainerSchemaNode node) { + return node instanceof EffectiveStatement + && ((EffectiveStatement) node).getDeclared().getStatementSource() == StatementSource.DECLARATION; + } + @Override public BindingCodecTree create(final BindingRuntimeContext context) { return codecRegistry.create(context); -- 2.36.6