Correct ActionService generics 43/99943/2
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 3 Mar 2022 08:49:24 +0000 (09:49 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 13 Mar 2022 08:26:05 +0000 (09:26 +0100)
We need to allow for any Action, even for KeyedListAction. Make sure to
adjust generics accordingly and add a test.

JIRA: MDSAL-726
Change-Id: I04c8fdf1c8803647c8640bbdd10c19304336b915
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-api/src/main/java/org/opendaylight/mdsal/binding/api/ActionService.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionServiceAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/osgi/OSGiActionService.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/AbstractActionAdapterTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/ActionServiceAdapterTest.java

index be0b85c9071b882bb904d2615a3df7bc8598e127..96542f7efea71b149cc937f76586b3a0a2d43cb6 100644 (file)
@@ -53,25 +53,25 @@ public interface ActionService extends BindingService {
      * @throws NullPointerException if {@code actionInterface} is null
      * @throws IllegalArgumentException when {@code actionInterface} does not conform to the Binding Specification
      */
-    <P extends DataObject, A extends Action<InstanceIdentifier<P>, ?, ?>> A getActionHandle(ActionSpec<A, P> spec,
-        Set<DataTreeIdentifier<P>> validNodes);
+    <P extends DataObject, A extends Action<? extends InstanceIdentifier<P>, ?, ?>> A getActionHandle(
+        ActionSpec<A, P> spec, Set<DataTreeIdentifier<P>> validNodes);
 
-    default <P extends DataObject, A extends Action<InstanceIdentifier<P>, ?, ?>> A getActionHandle(
+    default <P extends DataObject, A extends Action<? extends InstanceIdentifier<P>, ?, ?>> A getActionHandle(
             final ActionSpec<A, P> spec) {
         return getActionHandle(spec, ImmutableSet.of());
     }
 
-    default <P extends DataObject, A extends Action<InstanceIdentifier<P>, ?, ?>> A getActionHandle(
+    default <P extends DataObject, A extends Action<? extends InstanceIdentifier<P>, ?, ?>> A getActionHandle(
             final ActionSpec<A, P> spec, final LogicalDatastoreType dataStore, final InstanceIdentifier<P> path) {
         return getActionHandle(spec, ImmutableSet.of(DataTreeIdentifier.create(dataStore, path)));
     }
 
-    default <P extends DataObject, A extends Action<InstanceIdentifier<P>, ?, ?>> A getActionHandle(
+    default <P extends DataObject, A extends Action<? extends InstanceIdentifier<P>, ?, ?>> A getActionHandle(
             final ActionSpec<A, P> spec, final InstanceIdentifier<P> path) {
         return getActionHandle(spec, LogicalDatastoreType.OPERATIONAL, path);
     }
 
-    default <P extends DataObject, A extends Action<InstanceIdentifier<P>, ?, ?>> A getActionHandle(
+    default <P extends DataObject, A extends Action<? extends InstanceIdentifier<P>, ?, ?>> A getActionHandle(
             final ActionSpec<A, P> spec, @SuppressWarnings("unchecked") final DataTreeIdentifier<P>... nodes) {
         return getActionHandle(spec, ImmutableSet.copyOf(nodes));
     }
index 77416b5f1e6c8a5b1590bffa477f95cf71d43e40..08f6ff6bd830ecd3e43376c86afd1cef285c0ae9 100644 (file)
@@ -52,7 +52,7 @@ final class ActionServiceAdapter
     }
 
     @Override
-    public <P extends DataObject, A extends Action<InstanceIdentifier<P>, ?, ?>> A getActionHandle(
+    public <P extends DataObject, A extends Action<? extends InstanceIdentifier<P>, ?, ?>> A getActionHandle(
             final ActionSpec<A, P> spec, final Set<DataTreeIdentifier<P>> nodes) {
         final var type = spec.type();
         final var adapter = getAdapter(spec);
index 0b9999f286dfa53185456c08413a69f171ce7270..7f79dc858e26ce2aae539fa71cfa6645fdfaef38 100644 (file)
@@ -34,7 +34,7 @@ public final class OSGiActionService extends AbstractAdaptedService<ActionServic
     }
 
     @Override
-    public <P extends DataObject, A extends Action<InstanceIdentifier<P>, ?, ?>> A getActionHandle(
+    public <P extends DataObject, A extends Action<? extends InstanceIdentifier<P>, ?, ?>> A getActionHandle(
             final ActionSpec<A, P> spec, final Set<@NonNull DataTreeIdentifier<P>> validNodes) {
         return delegate().getActionHandle(spec, validNodes);
     }
index bf543d5406e384fb3f2f363f7f2188fd89aee5ed..5b979b8aff109f688891a40881c32b570a71ffe1 100644 (file)
@@ -38,4 +38,8 @@ public abstract class AbstractActionAdapterTest extends AbstractAdapterTest  {
     protected static final Input BINDING_FOO_INPUT = new InputBuilder().setXyzzy("xyzzy").build();
     protected static final Output BINDING_FOO_OUTPUT = new OutputBuilder().build();
 
+    protected static final org.opendaylight.yang.gen.v1.urn.odl.actions.norev.lstio.fooio.Input BINDING_LSTIO_INPUT =
+        new org.opendaylight.yang.gen.v1.urn.odl.actions.norev.lstio.fooio.InputBuilder().build();
+    protected static final org.opendaylight.yang.gen.v1.urn.odl.actions.norev.lstio.fooio.Output BINDING_LSTIO_OUTPUT =
+        new org.opendaylight.yang.gen.v1.urn.odl.actions.norev.lstio.fooio.OutputBuilder().build();
 }
index 76e28aa80f5fe071c699f0a32de2160f2a90cea7..1ec1c86e9ccaa4e9ccced8702ea26b814ccbec42 100644 (file)
@@ -29,9 +29,13 @@ import org.opendaylight.mdsal.dom.api.DOMActionResult;
 import org.opendaylight.mdsal.dom.api.DOMActionService;
 import org.opendaylight.mdsal.dom.spi.SimpleDOMActionResult;
 import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.Cont;
+import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.Lstio;
+import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.LstioKey;
 import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.cont.Foo;
 import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.cont.foo.Output;
+import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.lstio.Fooio;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 
 @RunWith(MockitoJUnitRunner.StrictStubs.class)
@@ -67,4 +71,20 @@ public class ActionServiceAdapterTest extends AbstractActionAdapterTest {
         assertEquals(List.of(), bindingResult.getErrors());
         assertEquals(BINDING_FOO_OUTPUT, bindingResult.getResult());
     }
+
+    @Test
+    public void testKeyedInvocation() throws ExecutionException {
+        final var handle = service.getActionHandle(ActionSpec.builder(Lstio.class).build(Fooio.class));
+        final var future = handle.invoke((KeyedInstanceIdentifier<Lstio, LstioKey>)
+                InstanceIdentifier.builder(Lstio.class, new LstioKey("test")).build(),
+                BINDING_LSTIO_INPUT);
+        assertNotNull(future);
+        assertFalse(future.isDone());
+
+        domResult.set(new SimpleDOMActionResult(DOM_FOO_OUTPUT, List.of()));
+        final var bindingResult = Futures.getDone(future);
+
+        assertEquals(List.of(), bindingResult.getErrors());
+        assertEquals(BINDING_LSTIO_OUTPUT, bindingResult.getResult());
+    }
 }