From 2c371b76f661e3cd6ceae3eb100be02a8ac5c052 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jakub=20T=C3=B3th?= Date: Fri, 14 Sep 2018 10:44:14 +0200 Subject: [PATCH] Fix KeyedListAction serialization MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit SchemaRootCodecContext needs to understand both Action and KeyedListAction, as their parameterizations differ. JIRA: MDSAL-371 Change-Id: I405a73b1a8ca8801ae1786be704cefe674c5fb72 Signed-off-by: Jakub Tóth Signed-off-by: Robert Varga --- .../codec/impl/SchemaRootCodecContext.java | 24 +++++++++++--- .../test/ActionSerializeDeserializeTest.java | 32 ++++++++++++++++++- .../src/main/yang/actions.yang | 19 +++++++++++ 3 files changed, 70 insertions(+), 5 deletions(-) diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SchemaRootCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SchemaRootCodecContext.java index 5eacddfe0c..21a8cc179e 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SchemaRootCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SchemaRootCodecContext.java @@ -8,6 +8,7 @@ package org.opendaylight.mdsal.binding.dom.codec.impl; import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Verify.verify; import com.google.common.base.Throwables; @@ -16,6 +17,7 @@ import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.util.concurrent.UncheckedExecutionException; +import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.List; import java.util.Optional; @@ -27,6 +29,7 @@ import org.opendaylight.yangtools.yang.binding.ChoiceIn; import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.KeyedListAction; import org.opendaylight.yangtools.yang.binding.Notification; import org.opendaylight.yangtools.yang.binding.RpcInput; import org.opendaylight.yangtools.yang.binding.RpcOutput; @@ -206,13 +209,26 @@ final class SchemaRootCodecContext extends DataContainerCo } ActionCodecContext createActionContext(final Class> action) { - final Type[] args = ClassLoaderUtils.findParameterizedType(action, Action.class).getActualTypeArguments(); - checkArgument(args.length == 3, "Unexpected (%s) Action generatic arguments", args.length); + if (KeyedListAction.class.isAssignableFrom(action)) { + return prepareActionContext(2, 3, 4, action, KeyedListAction.class); + } else if (Action.class.isAssignableFrom(action)) { + return prepareActionContext(1, 2, 3, action, Action.class); + } + throw new IllegalArgumentException("The specific action type does not exist for action " + action.getName()); + } + private ActionCodecContext prepareActionContext(final int inputOffset, final int outputOffset, + final int expectedArgsLength, final Class> action, final Class actionType) { + final ParameterizedType paramType = checkNotNull(ClassLoaderUtils.findParameterizedType(action, actionType), + "There does not exist any ParameterType in %s", action); + final Type[] args = paramType.getActualTypeArguments(); + checkArgument(args.length == expectedArgsLength, "Unexpected (%s) Action generatic arguments", args.length); final ActionDefinition schema = factory().getRuntimeContext().getActionDefinition(action); return new ActionCodecContext( - DataContainerCodecPrototype.from(asClass(args[1], RpcInput.class), schema.getInput(), factory()).get(), - DataContainerCodecPrototype.from(asClass(args[2], RpcOutput.class), schema.getOutput(), factory()).get()); + DataContainerCodecPrototype.from(asClass(args[inputOffset], RpcInput.class), schema.getInput(), + factory()).get(), + DataContainerCodecPrototype.from(asClass(args[outputOffset], RpcOutput.class), schema.getOutput(), + factory()).get()); } private static Class asClass(final Type type, final Class target) { diff --git a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/ActionSerializeDeserializeTest.java b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/ActionSerializeDeserializeTest.java index fb3783d655..05a45d42d1 100644 --- a/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/ActionSerializeDeserializeTest.java +++ b/binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/test/ActionSerializeDeserializeTest.java @@ -18,6 +18,7 @@ import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.cont.Foo; import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.cont.foo.InputBuilder; import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.cont.foo.OutputBuilder; import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.grpcont.Bar; +import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.lstio.Fooio; import org.opendaylight.yangtools.yang.binding.RpcInput; import org.opendaylight.yangtools.yang.binding.RpcOutput; import org.opendaylight.yangtools.yang.common.QName; @@ -47,10 +48,25 @@ public class ActionSerializeDeserializeTest extends AbstractBindingCodecTest { private static final RpcOutput BINDING_BAR_OUTPUT = new org.opendaylight.yang.gen.v1.urn.odl.actions.norev.grp.bar.OutputBuilder().setXyzzy("xyzzy").build(); + private static final NodeIdentifier FOOIO_INPUT = NodeIdentifier.create(operationInputQName(Fooio.QNAME + .getModule())); + private static final NodeIdentifier FOOIO_OUTPUT = NodeIdentifier.create(operationOutputQName(Fooio.QNAME + .getModule())); + private static final NodeIdentifier FOOIO_I = NodeIdentifier.create(QName.create(Fooio.QNAME, "fooi")); + private static final NodeIdentifier FOOIO_O = NodeIdentifier.create(QName.create(Fooio.QNAME, "fooo")); + private static final ContainerNode DOM_FOOIO_INPUT = containerBuilder().withNodeIdentifier(FOOIO_INPUT).withChild( + leafBuilder().withNodeIdentifier(FOOIO_I).withValue("ifoo").build()).build(); + private static final ContainerNode DOM_FOOIO_OUTPUT = containerBuilder().withNodeIdentifier(FOOIO_OUTPUT).withChild( + leafBuilder().withNodeIdentifier(FOOIO_O).withValue("ofoo").build()).build(); + private static final RpcInput BINDING_FOOIO_INPUT = + new org.opendaylight.yang.gen.v1.urn.odl.actions.norev.lstio.fooio.InputBuilder().setFooi("ifoo").build(); + private static final RpcOutput BINDING_FOOIO_OUTPUT = + new org.opendaylight.yang.gen.v1.urn.odl.actions.norev.lstio.fooio.OutputBuilder().setFooo("ofoo").build(); + @Test public void testSerialization() { assertEquals(DOM_FOO_INPUT, registry.toLazyNormalizedNodeActionInput(Foo.class, BINDING_FOO_INPUT) - .getDelegate()); + .getDelegate()); assertEquals(DOM_BAR_INPUT, registry.toLazyNormalizedNodeActionInput(Bar.class, BINDING_BAR_INPUT) .getDelegate()); assertEquals(DOM_FOO_OUTPUT, registry.toLazyNormalizedNodeActionOutput(Foo.class, BINDING_FOO_OUTPUT) @@ -59,6 +75,14 @@ public class ActionSerializeDeserializeTest extends AbstractBindingCodecTest { .getDelegate()); } + @Test + public void testKeyedListActionSerialization() { + assertEquals(DOM_FOOIO_INPUT, registry.toLazyNormalizedNodeActionInput(Fooio.class, BINDING_FOOIO_INPUT) + .getDelegate()); + assertEquals(DOM_FOOIO_OUTPUT, registry.toLazyNormalizedNodeActionOutput(Fooio.class, BINDING_FOOIO_OUTPUT) + .getDelegate()); + } + @Test public void testDeserialization() { assertEquals(BINDING_FOO_INPUT, registry.fromNormalizedNodeActionInput(Foo.class, DOM_FOO_INPUT)); @@ -66,4 +90,10 @@ public class ActionSerializeDeserializeTest extends AbstractBindingCodecTest { assertEquals(BINDING_FOO_OUTPUT, registry.fromNormalizedNodeActionOutput(Foo.class, DOM_FOO_OUTPUT)); assertEquals(BINDING_BAR_OUTPUT, registry.fromNormalizedNodeActionOutput(Bar.class, DOM_FOO_INPUT)); } + + @Test + public void testKeyedListActionDeserialization() { + assertEquals(BINDING_FOOIO_INPUT, registry.fromNormalizedNodeActionInput(Fooio.class, DOM_FOOIO_INPUT)); + assertEquals(BINDING_FOOIO_OUTPUT, registry.fromNormalizedNodeActionOutput(Fooio.class, DOM_FOOIO_OUTPUT)); + } } diff --git a/binding/mdsal-binding-test-model/src/main/yang/actions.yang b/binding/mdsal-binding-test-model/src/main/yang/actions.yang index 5f2eff6431..299519677e 100644 --- a/binding/mdsal-binding-test-model/src/main/yang/actions.yang +++ b/binding/mdsal-binding-test-model/src/main/yang/actions.yang @@ -23,6 +23,25 @@ module actions { } } + list lstio { + key keyio; + leaf keyio { + type string; + } + action fooio { + input { + leaf fooi { + type string; + } + } + output { + leaf fooo { + type string; + } + } + } + } + grouping grp { action bar { output { -- 2.36.6