private RpcInvocationStrategy createStrategy(final Method method, final RpcDefinition schema) {
final QName rpcType = schema.getQName();
- final RpcRoutingStrategy strategy = RpcRoutingStrategy.from(schema);
+ final RpcRoutingStrategy strategy = RpcRoutingStrategy.from(schema.asEffectiveStatement());
return strategy.isContextBasedRouted() ? new RoutedStrategy(rpcType, method, strategy.getLeaf())
: new NonRoutedStrategy(rpcType);
}
import java.util.List;
import java.util.Map;
import java.util.Set;
+import org.eclipse.jdt.annotation.Nullable;
import org.opendaylight.mdsal.dom.api.DOMRpcAvailabilityListener;
import org.opendaylight.mdsal.dom.api.DOMRpcIdentifier;
import org.opendaylight.mdsal.dom.api.DOMRpcImplementation;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.Module;
-import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement;
final class DOMRpcRoutingTable extends AbstractDOMRoutingTable<DOMRpcIdentifier, YangInstanceIdentifier,
DOMRpcImplementation, DOMRpcAvailabilityListener, QName, AbstractDOMRpcRoutingTableEntry> {
@Override
AbstractDOMRpcRoutingTableEntry createOperationEntry(final EffectiveModelContext context, final QName key,
final Map<YangInstanceIdentifier, List<DOMRpcImplementation>> implementations) {
- final RpcDefinition rpcDef = findRpcDefinition(context, key);
+ final var rpcDef = findRpcDefinition(context, key);
if (rpcDef == null) {
return new UnknownDOMRpcRoutingTableEntry(key, implementations);
}
final RpcRoutingStrategy strategy = RpcRoutingStrategy.from(rpcDef);
if (strategy.isContextBasedRouted()) {
- return new RoutedDOMRpcRoutingTableEntry(rpcDef, YangInstanceIdentifier.of(strategy.getLeaf()),
+ return new RoutedDOMRpcRoutingTableEntry(rpcDef.argument(), YangInstanceIdentifier.of(strategy.getLeaf()),
implementations);
}
- return new GlobalDOMRpcRoutingTableEntry(rpcDef, implementations);
+ return new GlobalDOMRpcRoutingTableEntry(rpcDef.argument(), implementations);
}
- private static RpcDefinition findRpcDefinition(final SchemaContext context, final QName qname) {
- if (context != null) {
- final Module module = context.findModule(qname.getModule()).orElse(null);
- if (module != null && module.getRpcs() != null) {
- for (RpcDefinition rpc : module.getRpcs()) {
- if (qname.equals(rpc.getQName())) {
- return rpc;
- }
- }
- }
- }
-
- return null;
+ private static @Nullable RpcEffectiveStatement findRpcDefinition(final EffectiveModelContext context,
+ final QName qname) {
+ return context == null ? null : context.findModuleStatement(qname.getModule())
+ .flatMap(module -> module.findSchemaTreeNode(qname))
+ .filter(RpcEffectiveStatement.class::isInstance)
+ .map(RpcEffectiveStatement.class::cast)
+ .orElse(null);
}
}
import java.util.List;
import java.util.Map;
+import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.mdsal.dom.api.DOMRpcIdentifier;
import org.opendaylight.mdsal.dom.api.DOMRpcImplementation;
+import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
final class GlobalDOMRpcRoutingTableEntry extends AbstractDOMRpcRoutingTableEntry {
private GlobalDOMRpcRoutingTableEntry(final DOMRpcIdentifier rpcId,
// We do not need the RpcDefinition, but this makes sure we do not
// forward something we don't know to be an RPC.
- GlobalDOMRpcRoutingTableEntry(final RpcDefinition def,
+ GlobalDOMRpcRoutingTableEntry(final @NonNull QName rpcName,
final Map<YangInstanceIdentifier, List<DOMRpcImplementation>> impls) {
- super(DOMRpcIdentifier.create(def.getQName()), impls);
+ super(DOMRpcIdentifier.create(rpcName), impls);
}
@Override
import java.util.List;
import java.util.Map;
+import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.mdsal.dom.api.DOMRpcIdentifier;
import org.opendaylight.mdsal.dom.api.DOMRpcImplementation;
+import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
final class RoutedDOMRpcRoutingTableEntry extends AbstractDOMRpcRoutingTableEntry {
private RoutedDOMRpcRoutingTableEntry(final DOMRpcIdentifier routedRpcId,
super(routedRpcId, impls);
}
- RoutedDOMRpcRoutingTableEntry(final RpcDefinition def, final YangInstanceIdentifier keyId,
+ RoutedDOMRpcRoutingTableEntry(final @NonNull QName rpcName, final YangInstanceIdentifier keyId,
final Map<YangInstanceIdentifier, List<DOMRpcImplementation>> impls) {
- super(DOMRpcIdentifier.create(def.getQName(), keyId), impls);
+ super(DOMRpcIdentifier.create(rpcName, keyId), impls);
}
@Override
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
import static org.opendaylight.mdsal.dom.broker.TestUtils.EXCEPTION_TEXT;
import static org.opendaylight.mdsal.dom.broker.TestUtils.TEST_CONTAINER;
import static org.opendaylight.mdsal.dom.broker.TestUtils.getTestRpcImplementation;
+import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
import org.junit.Test;
import org.opendaylight.mdsal.dom.api.DOMRpcImplementation;
import org.opendaylight.mdsal.dom.api.DOMRpcImplementationNotAvailableException;
import org.opendaylight.mdsal.dom.broker.DOMRpcRouter.OperationInvocation;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
public class GlobalDOMRpcRoutingTableEntryTest {
@Test
public void basicTest() {
final Map<YangInstanceIdentifier, List<DOMRpcImplementation>> rpcImplementations = new HashMap<>();
final List<DOMRpcImplementation> rpcImplementation = new ArrayList<>();
- final RpcDefinition rpcDefinition = mock(RpcDefinition.class);
final YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().build();
- doReturn(TestModel.TEST2_QNAME).when(rpcDefinition).getQName();
final GlobalDOMRpcRoutingTableEntry globalDOMRpcRoutingTableEntry = new GlobalDOMRpcRoutingTableEntry(
- rpcDefinition, new HashMap<>());
+ TestModel.TEST2_QNAME, new HashMap<>());
rpcImplementation.add(getTestRpcImplementation());
rpcImplementations.put(yangInstanceIdentifier, rpcImplementation);
final ListenableFuture<?> future = OperationInvocation.invoke(
globalDOMRpcRoutingTableEntry.newInstance(rpcImplementations), TEST_CONTAINER);
- final ExecutionException ex = assertThrows(ExecutionException.class, () -> future.get(5, TimeUnit.SECONDS));
- final Throwable cause = ex.getCause();
+ final var cause = assertThrows(ExecutionException.class, () -> Futures.getDone(future)).getCause();
assertThat(cause, instanceOf(DOMRpcImplementationNotAvailableException.class));
assertThat(cause.getMessage(), containsString(EXCEPTION_TEXT));
}
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
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.RpcDefinition;
@RunWith(MockitoJUnitRunner.StrictStubs.class)
public class RoutedDOMRpcRoutingTableEntryTest {
.withChild(ImmutableNodes.leafNode(Rpcs.NAME, "name"))
.build();
- @Mock
- public RpcDefinition definition;
@Mock
public DOMRpcImplementation impl;
@Mock
@Before
public void before() {
- doReturn(Rpcs.BAR).when(definition).getQName();
// Note: ImmutableMap.of() allows get(null), Map.of() does not
- entry = new RoutedDOMRpcRoutingTableEntry(definition, CTX_IN_INPUT, ImmutableMap.of());
+ entry = new RoutedDOMRpcRoutingTableEntry(Rpcs.BAR, CTX_IN_INPUT, ImmutableMap.of());
}
@Test
import org.opendaylight.yangtools.concepts.Identifiable;
import org.opendaylight.yangtools.odlext.model.api.ContextReferenceEffectiveStatement;
import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
-import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.InputEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement;
public abstract sealed class RpcRoutingStrategy implements Identifiable<QName> {
*/
public abstract boolean isContextBasedRouted();
- public static RpcRoutingStrategy from(final RpcDefinition rpc) {
+ public static @NonNull RpcRoutingStrategy from(final RpcEffectiveStatement rpc) {
// FIXME: deprecate context-reference
- for (EffectiveStatement<?, ?> stmt : rpc.getInput().asEffectiveStatement().effectiveSubstatements()) {
+ return of(rpc.argument(), rpc.findFirstEffectiveSubstatement(InputEffectiveStatement.class)
+ .orElseThrow(() -> new IllegalArgumentException("Cannot find input in " + rpc)));
+ }
+
+ private static @NonNull RpcRoutingStrategy of(final QName rpcName, final InputEffectiveStatement input) {
+ for (var stmt : input.effectiveSubstatements()) {
if (stmt instanceof SchemaTreeEffectiveStatement<?> schemaStmt) {
final var context =
stmt.findFirstEffectiveSubstatementArgument(ContextReferenceEffectiveStatement.class);
if (context.isPresent()) {
- return new RoutedRpcStrategy(rpc.getQName(), context.orElseThrow(), schemaStmt.argument());
+ return new RoutedRpcStrategy(rpcName, context.orElseThrow(), schemaStmt.argument());
}
}
}
- return new GlobalRpcStrategy(rpc.getQName());
+ return new GlobalRpcStrategy(rpcName);
}
private static final class RoutedRpcStrategy extends RpcRoutingStrategy {
import static org.junit.Assert.assertTrue;
import com.google.common.collect.Iterables;
-import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.opendaylight.yang.gen.v1.urn.opendaylight.yang.extension.yang.ext.rev130709.$YangModuleInfoImpl;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
+import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement;
import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource;
import org.opendaylight.yangtools.yang.parser.api.YangParserConfiguration;
import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
public class RpcRoutingStrategyTest {
- private static Collection<? extends RpcDefinition> RPCS;
+ private static List<RpcEffectiveStatement> RPCS;
@BeforeClass
public static void beforeClass() {
$YangModuleInfoImpl.getInstance().getYangTextByteSource()),
YangTextSchemaSource.forResource(RpcRoutingStrategy.class, "/rpc-routing-strategy.yang"));
- RPCS = ctx.getModules().stream()
- .filter(module -> module.getName().equals("foo"))
- .findFirst().orElseThrow()
- .getRpcs();
+ RPCS = Iterables.getOnlyElement(ctx.findModuleStatements("foo"))
+ .streamEffectiveSubstatements(RpcEffectiveStatement.class)
+ .collect(Collectors.toUnmodifiableList());
}
@AfterClass