Replace SchemaPath with SchemaNodeIdentifier.Absolute/QName 05/91505/11
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 21 Jul 2020 11:42:54 +0000 (13:42 +0200)
committerRobert Varga <nite@hq.sk>
Mon, 3 Aug 2020 09:12:25 +0000 (09:12 +0000)
SchemaNode.getPath() is going away, which also means we do not need
to tie ourselves down with SchemaPath.

RPCs embrace the fact they are really just a top-level construct
and use a plain QName.

Actions and notifications are required to use
SchemaNodeIdentifier.Absolute, which is the exact addressing
equivalent for them.

JIRA: MDSAL-569
Change-Id: I3a8f820c7b8f8a161881865bdac5a00d969cfc63
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
52 files changed:
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/ActionProviderServiceAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMNotificationListenerAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcImplementationAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcProviderServiceAdapter.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/CurrentAdapterSerializer.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazySerializedContainerNode.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/LazySerializedDOMNotification.java
binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/RpcServiceAdapter.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/ActionLookupTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcImplementationAdapterTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/BindingDOMRpcIntegrationTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/LazySerializedContainerNodeTest.java
binding/mdsal-binding-dom-adapter/src/test/java/org/opendaylight/mdsal/binding/dom/adapter/Mdsal500Test.java
binding/mdsal-binding-dom-codec-api/src/main/java/org/opendaylight/mdsal/binding/dom/codec/api/BindingNormalizedNodeSerializer.java
binding/mdsal-binding-dom-codec-spi/src/main/java/org/opendaylight/mdsal/binding/dom/codec/spi/ForwardingBindingDOMCodecServices.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/SchemaRootCodecContext.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/Mdsal552Test.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/NotificationProcessingTest.java
binding/mdsal-binding-dom-codec/src/test/java/org/opendaylight/mdsal/binding/dom/codec/impl/RpcDataSerializationTest.java
dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMActionAvailabilityExtension.java
dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMActionImplementation.java
dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMActionInstance.java
dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMActionService.java
dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMNotification.java
dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMNotificationService.java
dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMRpcIdentifier.java
dom/mdsal-dom-api/src/main/java/org/opendaylight/mdsal/dom/api/DOMRpcService.java
dom/mdsal-dom-api/src/test/java/org/opendaylight/mdsal/dom/api/DOMRpcIdentifierTest.java
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/AbstractDOMRoutingTable.java
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/AbstractDOMRoutingTableEntry.java
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/AbstractDOMRpcRoutingTableEntry.java
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMActionRoutingTable.java
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMActionRoutingTableEntry.java
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMNotificationRouter.java
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMRpcRouter.java
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMRpcRoutingTable.java
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/GlobalDOMRpcRoutingTableEntry.java
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/OSGiDOMNotificationRouter.java
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/RoutedDOMRpcRoutingTableEntry.java
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/UnknownDOMRpcRoutingTableEntry.java
dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/DOMNotificationRouterTest.java
dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/DOMRpcRouterTest.java
dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/GlobalDOMRpcRoutingTableEntryTest.java
dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/RoutedDOMRpcRoutingTableEntryTest.java
dom/mdsal-dom-broker/src/test/java/org/opendaylight/mdsal/dom/broker/UnknownDOMRpcRoutingTableEntryTest.java
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/DOMNotificationSubscriptionListener.java
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMActionService.java
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMNotificationService.java
dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMRpcService.java
dom/mdsal-dom-spi/src/test/java/org/opendaylight/mdsal/dom/spi/ForwardingDOMRpcServiceTest.java

index adcc42423697cd7076b668544f295f3149b18500..a8ccb88d196526d9204e98131941e7e88073bfc3 100644 (file)
@@ -26,20 +26,20 @@ import org.opendaylight.yangtools.yang.binding.Action;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.RpcInput;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 @NonNullByDefault
 final class ActionAdapter extends AbstractBindingAdapter<DOMActionService> implements InvocationHandler {
     private final Class<? extends Action<?, ?, ?>> type;
     private final NodeIdentifier inputName;
-    private final SchemaPath schemaPath;
+    private final Absolute actionPath;
 
     ActionAdapter(final AdapterContext codec, final DOMActionService delegate,
             final Class<? extends Action<?, ?, ?>> type) {
         super(codec, delegate);
         this.type = requireNonNull(type);
-        this.schemaPath = currentSerializer().getActionPath(type);
-        this.inputName = NodeIdentifier.create(operationInputQName(schemaPath.getLastComponent().getModule()));
+        this.actionPath = currentSerializer().getActionPath(type);
+        this.inputName = NodeIdentifier.create(operationInputQName(actionPath.lastNodeIdentifier().getModule()));
     }
 
     @Override
@@ -66,7 +66,7 @@ final class ActionAdapter extends AbstractBindingAdapter<DOMActionService> imple
                     final InstanceIdentifier<?> path = (InstanceIdentifier<?>) requireNonNull(args[0]);
                     final RpcInput input = (RpcInput) requireNonNull(args[1]);
                     final CurrentAdapterSerializer serializer = currentSerializer();
-                    final ListenableFuture<? extends DOMActionResult> future = getDelegate().invokeAction(schemaPath,
+                    final ListenableFuture<? extends DOMActionResult> future = getDelegate().invokeAction(actionPath,
                         new DOMDataTreeIdentifier(LogicalDatastoreType.OPERATIONAL,
                             serializer.toYangInstanceIdentifier(path)),
                         serializer.toLazyNormalizedNodeActionInput(type, inputName, input));
index a5e9e4bbd247499030c1f6f8dea25b80c0ab9188..43525b3048d49d56e4aeb4041efed3fa796ea82c 100644 (file)
@@ -33,7 +33,7 @@ import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.common.YangConstants;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 @NonNullByDefault
 public final class ActionProviderServiceAdapter extends AbstractBindingAdapter<DOMActionProviderService>
@@ -65,10 +65,10 @@ public final class ActionProviderServiceAdapter extends AbstractBindingAdapter<D
     public <O extends DataObject, P extends InstanceIdentifier<O>, T extends Action<P, ?, ?>, S extends T>
             ObjectRegistration<S> registerImplementation(final Class<T> actionInterface, final S implementation,
                 final LogicalDatastoreType datastore, final Set<DataTreeIdentifier<O>> validNodes) {
-        final SchemaPath path = currentSerializer().getActionPath(actionInterface);
+        final Absolute path = currentSerializer().getActionPath(actionInterface);
         final ObjectRegistration<DOMActionImplementation> reg = getDelegate().registerActionImplementation(
             new Impl(adapterContext(),
-                NodeIdentifier.create(YangConstants.operationOutputQName(path.getLastComponent().getModule())),
+                NodeIdentifier.create(YangConstants.operationOutputQName(path.lastNodeIdentifier().getModule())),
                 actionInterface, implementation), ImmutableSet.of());
         return new AbstractObjectRegistration<>(implementation) {
             @Override
@@ -94,7 +94,7 @@ public final class ActionProviderServiceAdapter extends AbstractBindingAdapter<D
 
         @Override
         @SuppressWarnings({ "rawtypes", "unchecked" })
-        public ListenableFuture<? extends DOMActionResult> invokeAction(final SchemaPath type,
+        public ListenableFuture<? extends DOMActionResult> invokeAction(final Absolute type,
                 final DOMDataTreeIdentifier path, final ContainerNode input) {
             final CurrentAdapterSerializer codec = adapterContext.currentSerializer();
 
index b2e515923c36f16d27ec5f5cbb73ce4bf71dc1ab..2785500fa2f9af350a37e07fbe673bea650110fb 100644 (file)
@@ -24,13 +24,13 @@ import org.opendaylight.mdsal.dom.api.DOMNotificationListener;
 import org.opendaylight.yangtools.yang.binding.Notification;
 import org.opendaylight.yangtools.yang.binding.NotificationListener;
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 class BindingDOMNotificationListenerAdapter implements DOMNotificationListener {
 
     private final AdapterContext adapterContext;
     private final NotificationListener delegate;
-    private final ImmutableMap<SchemaPath, NotificationListenerInvoker> invokers;
+    private final ImmutableMap<Absolute, NotificationListenerInvoker> invokers;
 
     BindingDOMNotificationListenerAdapter(final AdapterContext adapterContext, final NotificationListener delegate) {
         this.adapterContext = requireNonNull(adapterContext);
@@ -41,7 +41,7 @@ class BindingDOMNotificationListenerAdapter implements DOMNotificationListener {
     @Override
     public void onNotification(final DOMNotification notification) {
         final Notification baNotification = deserialize(notification);
-        final QName notificationQName = notification.getType().getLastComponent();
+        final QName notificationQName = notification.getType().lastNodeIdentifier();
         getInvoker(notification.getType()).invokeNotification(delegate, notificationQName, baNotification);
     }
 
@@ -58,17 +58,17 @@ class BindingDOMNotificationListenerAdapter implements DOMNotificationListener {
                 : serializer.fromNormalizedNodeNotification(notification.getType(), notification.getBody());
     }
 
-    private NotificationListenerInvoker getInvoker(final SchemaPath type) {
+    private NotificationListenerInvoker getInvoker(final Absolute type) {
         return invokers.get(type);
     }
 
-    protected Set<SchemaPath> getSupportedNotifications() {
+    protected Set<Absolute> getSupportedNotifications() {
         return invokers.keySet();
     }
 
-    private static ImmutableMap<SchemaPath, NotificationListenerInvoker> createInvokerMapFor(
+    private static ImmutableMap<Absolute, NotificationListenerInvoker> createInvokerMapFor(
             final Class<? extends NotificationListener> implClz) {
-        final Map<SchemaPath, NotificationListenerInvoker> builder = new HashMap<>();
+        final Map<Absolute, NotificationListenerInvoker> builder = new HashMap<>();
         for (final TypeToken<?> ifaceToken : TypeToken.of(implClz).getTypes().interfaces()) {
             Class<?> iface = ifaceToken.getRawType();
             if (NotificationListener.class.isAssignableFrom(iface) && BindingReflections.isBindingClass(iface)) {
@@ -76,7 +76,7 @@ class BindingDOMNotificationListenerAdapter implements DOMNotificationListener {
                 final Class<? extends NotificationListener> listenerType
                         = (Class<? extends NotificationListener>) iface;
                 final NotificationListenerInvoker invoker = NotificationListenerInvoker.from(listenerType);
-                for (final SchemaPath path : getNotificationTypes(listenerType)) {
+                for (final Absolute path : getNotificationTypes(listenerType)) {
                     builder.put(path, invoker);
                 }
             }
@@ -84,15 +84,14 @@ class BindingDOMNotificationListenerAdapter implements DOMNotificationListener {
         return ImmutableMap.copyOf(builder);
     }
 
-    private static Set<SchemaPath> getNotificationTypes(final Class<? extends NotificationListener> type) {
+    private static Set<Absolute> getNotificationTypes(final Class<? extends NotificationListener> type) {
         // TODO: Investigate possibility and performance impact if we cache this or expose
         // it from NotificationListenerInvoker
-        final Set<SchemaPath> ret = new HashSet<>();
+        final Set<Absolute> ret = new HashSet<>();
         for (final Method method : type.getMethods()) {
             if (BindingReflections.isNotificationCallback(method)) {
                 final Class<?> notification = method.getParameterTypes()[0];
-                final QName name = BindingReflections.findQName(notification);
-                ret.add(SchemaPath.create(true, name));
+                ret.add(Absolute.of(BindingReflections.findQName(notification)));
             }
         }
         return ret;
index 35b2d8b97022946855378de8f941818b61aa4abe..571b3ececf312c6eab0b99d82e96248f1051ed27 100644 (file)
@@ -7,6 +7,7 @@
  */
 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;
 
@@ -14,9 +15,7 @@ import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.lang.reflect.Method;
-import java.util.HashMap;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.concurrent.ExecutionException;
 import org.opendaylight.mdsal.binding.dom.adapter.invoke.RpcServiceInvoker;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingLazyContainerNode;
@@ -31,7 +30,7 @@ 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.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 final class BindingDOMRpcImplementationAdapter implements DOMRpcImplementation {
     private static final Cache<Class<?>, RpcServiceInvoker> SERVICE_INVOKERS = CacheBuilder.newBuilder().weakKeys()
@@ -46,16 +45,9 @@ final class BindingDOMRpcImplementationAdapter implements DOMRpcImplementation {
     private final QName inputQname;
 
     <T extends RpcService> BindingDOMRpcImplementationAdapter(final AdapterContext adapterContext,
-            final Class<T> type, final Map<SchemaPath, Method> localNameToMethod, final T delegate) {
+            final Class<T> type, final Map<QName, Method> localNameToMethod, final T delegate) {
         try {
-            this.invoker = SERVICE_INVOKERS.get(type, () -> {
-                final Map<QName, Method> map = new HashMap<>();
-                for (Entry<SchemaPath, Method> e : localNameToMethod.entrySet()) {
-                    map.put(e.getKey().getLastComponent(), e.getValue());
-                }
-
-                return RpcServiceInvoker.from(map);
-            });
+            this.invoker = SERVICE_INVOKERS.get(type, () -> RpcServiceInvoker.from(localNameToMethod));
         } catch (ExecutionException e) {
             throw new IllegalArgumentException("Failed to create invokers for type " + type, e);
         }
@@ -67,10 +59,10 @@ final class BindingDOMRpcImplementationAdapter implements DOMRpcImplementation {
 
     @Override
     public ListenableFuture<DOMRpcResult> invokeRpc(final DOMRpcIdentifier rpc, final NormalizedNode<?, ?> input) {
-        final SchemaPath schemaPath = rpc.getType();
+        final QName rpcType = rpc.getType();
         final CurrentAdapterSerializer serializer = adapterContext.currentSerializer();
-        final DataObject bindingInput = input != null ? deserialize(serializer, schemaPath, input) : null;
-        final ListenableFuture<RpcResult<?>> bindingResult = invoke(schemaPath, bindingInput);
+        final DataObject bindingInput = input != null ? deserialize(serializer, rpcType, input) : null;
+        final ListenableFuture<RpcResult<?>> bindingResult = invoke(rpcType, bindingInput);
         return LazyDOMRpcResultFuture.create(serializer, bindingResult);
     }
 
@@ -79,16 +71,19 @@ final class BindingDOMRpcImplementationAdapter implements DOMRpcImplementation {
         return COST;
     }
 
-    private DataObject deserialize(final CurrentAdapterSerializer serializer, final SchemaPath rpcPath,
+    private DataObject deserialize(final CurrentAdapterSerializer serializer, final QName rpcType,
             final NormalizedNode<?, ?> input) {
         if (ENABLE_CODEC_SHORTCUT && input instanceof BindingLazyContainerNode) {
             return ((BindingLazyContainerNode<?>) input).getDataObject();
         }
-        final SchemaPath inputSchemaPath = rpcPath.createChild(inputQname);
-        return serializer.fromNormalizedNodeRpcData(inputSchemaPath, (ContainerNode) input);
+
+        final ContainerNode container = (ContainerNode) input;
+        checkArgument(inputQname.equals(container.getIdentifier().getNodeType()), "Unexpected RPC %s input %s", rpcType,
+            input);
+        return serializer.fromNormalizedNodeRpcData(Absolute.of(rpcType, inputQname), container);
     }
 
-    private ListenableFuture<RpcResult<?>> invoke(final SchemaPath schemaPath, final DataObject input) {
-        return invoker.invokeRpc(delegate, schemaPath.getLastComponent(), input);
+    private ListenableFuture<RpcResult<?>> invoke(final QName rpcType, final DataObject input) {
+        return invoker.invokeRpc(delegate, rpcType, input);
     }
 }
index c03d50a1a96a87b36c31b08b08e3ac7650d56b2a..91ff75fbebfa693590918a7071d3a29336112df9 100644 (file)
@@ -22,8 +22,8 @@ import org.opendaylight.mdsal.dom.api.DOMRpcProviderService;
 import org.opendaylight.yangtools.concepts.ObjectRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.RpcService;
+import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 @VisibleForTesting
 public class BindingDOMRpcProviderServiceAdapter extends AbstractBindingAdapter<DOMRpcProviderService>
@@ -49,7 +49,7 @@ public class BindingDOMRpcProviderServiceAdapter extends AbstractBindingAdapter<
 
     private <S extends RpcService, T extends S> ObjectRegistration<T> register(final Class<S> type,
             final T implementation, final Collection<YangInstanceIdentifier> rpcContextPaths) {
-        final Map<SchemaPath, Method> rpcs = currentSerializer().getRpcMethodToSchemaPath(type).inverse();
+        final Map<QName, Method> rpcs = currentSerializer().getRpcMethodToSchemaPath(type).inverse();
 
         final BindingDOMRpcImplementationAdapter adapter = new BindingDOMRpcImplementationAdapter(adapterContext(),
             type, rpcs, implementation);
@@ -58,11 +58,11 @@ public class BindingDOMRpcProviderServiceAdapter extends AbstractBindingAdapter<
         return new BindingRpcAdapterRegistration<>(implementation, domReg);
     }
 
-    private static Set<DOMRpcIdentifier> createDomRpcIdentifiers(final Set<SchemaPath> rpcs,
+    private static Set<DOMRpcIdentifier> createDomRpcIdentifiers(final Set<QName> rpcs,
             final Collection<YangInstanceIdentifier> paths) {
         final Set<DOMRpcIdentifier> ret = new HashSet<>();
         for (final YangInstanceIdentifier path : paths) {
-            for (final SchemaPath rpc : rpcs) {
+            for (final QName rpc : rpcs) {
                 ret.add(DOMRpcIdentifier.create(rpc, path));
             }
         }
index 0ccc8baa5844acc048b4d33cd556dd5fdcabb587..bad7ff3c3ecc91ad58ae1d28afec1c0833d56693 100644 (file)
@@ -17,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.collect.ImmutableBiMap;
+import com.google.common.collect.ImmutableList;
 import java.lang.reflect.Method;
 import java.util.Collection;
 import java.util.stream.Collectors;
@@ -32,12 +33,13 @@ import org.opendaylight.yangtools.yang.binding.Action;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.RpcService;
+import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -81,10 +83,11 @@ public final class CurrentAdapterSerializer extends ForwardingBindingDOMCodecSer
         return subtrees.stream().map(this::toDOMDataTreeIdentifier).collect(Collectors.toSet());
     }
 
-    @NonNull SchemaPath getActionPath(final @NonNull Class<? extends Action<?, ?, ?>> type) {
+    @NonNull Absolute getActionPath(final @NonNull Class<? extends Action<?, ?, ?>> type) {
+        // FIXME: we really just want a SchemaNodeIdentifier.Absolute here
         final ActionDefinition schema = getRuntimeContext().getActionDefinition(type);
         checkArgument(schema != null, "Failed to find schema for %s", type);
-        return schema.getPath();
+        return Absolute.of(ImmutableList.copyOf(schema.getPath().getPathFromRoot()));
     }
 
     // FIXME: This should be probably part of Binding Runtime context
@@ -103,13 +106,13 @@ public final class CurrentAdapterSerializer extends ForwardingBindingDOMCodecSer
     }
 
     // FIXME: This should be probably part of Binding Runtime context
-    ImmutableBiMap<Method, SchemaPath> getRpcMethodToSchemaPath(final Class<? extends RpcService> key) {
+    ImmutableBiMap<Method, QName> getRpcMethodToSchemaPath(final Class<? extends RpcService> key) {
         final Module module = getModule(key);
-        final ImmutableBiMap.Builder<Method, SchemaPath> ret = ImmutableBiMap.builder();
+        final ImmutableBiMap.Builder<Method, QName> ret = ImmutableBiMap.builder();
         try {
             for (final RpcDefinition rpcDef : module.getRpcs()) {
                 final Method method = findRpcMethod(key, rpcDef);
-                ret.put(method, rpcDef.getPath());
+                ret.put(method,rpcDef.getQName());
             }
         } catch (final NoSuchMethodException e) {
             throw new IllegalStateException("Rpc defined in model does not have representation in generated class.", e);
index e72f3629aabf59e25147cc8ea06a655274a91e78..eb826afecbb1b004aa0e92e1f01dead44d2f9494 100644 (file)
@@ -19,7 +19,6 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgum
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 /*
  * FIXME: This is a bit of functionality which should really live in binding-dom-codec, but for to happen we need
@@ -37,14 +36,14 @@ class LazySerializedContainerNode
         super(NodeIdentifier.create(identifier), binding, requireNonNull(codec));
     }
 
-    static ContainerNode create(final SchemaPath rpcName, final DataObject data,
+    static ContainerNode create(final QName rpcName, final DataObject data,
             final BindingNormalizedNodeSerializer codec) {
-        return data == null ? null : new LazySerializedContainerNode(rpcName.getLastComponent(), data, codec);
+        return data == null ? null : new LazySerializedContainerNode(rpcName, data, codec);
     }
 
-    static ContainerNode withContextRef(final SchemaPath rpcName, final DataObject data,
+    static ContainerNode withContextRef(final QName rpcName, final DataObject data,
             final LeafNode<?> contextRef, final BindingNormalizedNodeSerializer serializer) {
-        return new WithContextRef(rpcName.getLastComponent(), data, contextRef, serializer);
+        return new WithContextRef(rpcName, data, contextRef, serializer);
     }
 
     @Override
index f117ca0d03a9a84c568d817ef369523c030e9a48..40098457035db58588c252f5c357635490ab0a9f 100644 (file)
@@ -9,6 +9,9 @@ package org.opendaylight.mdsal.binding.dom.adapter;
 
 import static java.util.Objects.requireNonNull;
 
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
 import java.time.Instant;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
@@ -17,7 +20,7 @@ import org.opendaylight.mdsal.dom.api.DOMEvent;
 import org.opendaylight.mdsal.dom.api.DOMNotification;
 import org.opendaylight.yangtools.yang.binding.Notification;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 /**
  * Lazy serialized implementation of DOM Notification.
@@ -27,15 +30,27 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
  * notification.
  */
 public final class LazySerializedDOMNotification implements DOMNotification, DOMEvent {
+    private static final LoadingCache<Class<?>, Absolute> PATHS = CacheBuilder.newBuilder().weakKeys()
+            .build(new CacheLoader<Class<?>, Absolute>() {
+                @Override
+                public Absolute load(final Class<?> key) {
+                    // TODO: for nested (YANG 1.1) notifications we will need the SchemaPath where the notification is
+                    //       being invoked and use that instead of ROOT. How Binding users will refer to it is TBD (but
+                    //       probably InstanceIdentifier, which means we will need to do some lifting to find the
+                    //       SchemaPath)
+                    return Absolute.of(BindingReflections.findQName(key)).intern();
+                }
+            });
+
     private final @NonNull BindingNormalizedNodeSerializer codec;
     private final @NonNull Notification data;
-    private final @NonNull SchemaPath type;
+    private final @NonNull Absolute type;
     private final @NonNull Instant eventInstant;
 
     private volatile ContainerNode domBody;
 
     LazySerializedDOMNotification(final BindingNormalizedNodeSerializer codec, final Notification data,
-            final SchemaPath type, final Instant eventInstant) {
+            final Absolute type, final Instant eventInstant) {
         this.codec = requireNonNull(codec);
         this.data = requireNonNull(data);
         this.type = requireNonNull(type);
@@ -44,15 +59,12 @@ public final class LazySerializedDOMNotification implements DOMNotification, DOM
 
     static @NonNull DOMNotification create(final BindingNormalizedNodeSerializer codec, final Notification data,
             final Instant eventInstant) {
-        // TODO: for nested (YANG 1.1) notifications we will need the SchemaPath where the notification is being invoked
-        //       and use that instead of ROOT. How Binding users will refer to it is TBD (but probably
-        //       InstanceIdentifier, which means we will need to do some lifting to find the SchemaPath)
-        final SchemaPath type = SchemaPath.ROOT.createChild(BindingReflections.findQName(data.implementedInterface()));
+        final Absolute type = PATHS.getUnchecked(data.implementedInterface());
         return new LazySerializedDOMNotification(codec, data, type, eventInstant);
     }
 
     @Override
-    public SchemaPath getType() {
+    public Absolute getType() {
         return type;
     }
 
index 108e6e64c6c4137b577c0ba0be14a6e4be85eae6..f58253ed7e8b28e41b972a9d8de277b9e1e881a4 100644 (file)
@@ -22,6 +22,7 @@ import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
 import java.util.Map.Entry;
 import java.util.Optional;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
 import org.opendaylight.mdsal.dom.api.DOMRpcResult;
@@ -41,7 +42,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 class RpcServiceAdapter implements InvocationHandler {
     private final ImmutableMap<Method, RpcInvocationStrategy> rpcNames;
@@ -67,11 +68,10 @@ class RpcServiceAdapter implements InvocationHandler {
     }
 
     private RpcInvocationStrategy createStrategy(final Method method, final RpcDefinition schema) {
+        final QName rpcType = schema.getQName();
         final RpcRoutingStrategy strategy = RpcRoutingStrategy.from(schema);
-        if (strategy.isContextBasedRouted()) {
-            return new RoutedStrategy(schema.getPath(), method, strategy.getLeaf());
-        }
-        return new NonRoutedStrategy(schema.getPath());
+        return strategy.isContextBasedRouted() ? new RoutedStrategy(rpcType, method, strategy.getLeaf())
+                : new NonRoutedStrategy(rpcType);
     }
 
     RpcService getProxy() {
@@ -114,41 +114,40 @@ class RpcServiceAdapter implements InvocationHandler {
     }
 
     private abstract class RpcInvocationStrategy {
-        private final SchemaPath rpcName;
+        private final @NonNull Absolute outputPath;
 
-        RpcInvocationStrategy(final SchemaPath path) {
-            rpcName = path;
+        RpcInvocationStrategy(final QName rpcName) {
+            this.outputPath = Absolute.of(rpcName, YangConstants.operationOutputQName(rpcName.getModule()).intern())
+                    .intern();
         }
 
         final ListenableFuture<RpcResult<?>> invoke(final DataObject input) {
-            return invoke0(rpcName, serialize(input));
+            return invoke0(serialize(input));
         }
 
         abstract ContainerNode serialize(DataObject input);
 
-        final SchemaPath getRpcName() {
-            return rpcName;
+        final QName getRpcName() {
+            return outputPath.firstNodeIdentifier();
         }
 
-        ListenableFuture<RpcResult<?>> invoke0(final SchemaPath schemaPath, final ContainerNode input) {
-            final ListenableFuture<? extends DOMRpcResult> result = delegate.invokeRpc(schemaPath, input);
+        ListenableFuture<RpcResult<?>> invoke0(final ContainerNode input) {
+            final ListenableFuture<? extends DOMRpcResult> result =
+                    delegate.invokeRpc(outputPath.firstNodeIdentifier(), input);
             if (ENABLE_CODEC_SHORTCUT && result instanceof BindingRpcFutureAware) {
                 return ((BindingRpcFutureAware) result).getBindingFuture();
             }
 
-            return transformFuture(schemaPath, result, adapterContext.currentSerializer());
+            return transformFuture(result, adapterContext.currentSerializer());
         }
 
-        private ListenableFuture<RpcResult<?>> transformFuture(final SchemaPath rpc,
-                final ListenableFuture<? extends DOMRpcResult> domFuture,
+        private ListenableFuture<RpcResult<?>> transformFuture(final ListenableFuture<? extends DOMRpcResult> domFuture,
                 final BindingNormalizedNodeSerializer resultCodec) {
             return Futures.transform(domFuture, input -> {
                 final NormalizedNode<?, ?> domData = input.getResult();
                 final DataObject bindingResult;
                 if (domData != null) {
-                    final SchemaPath rpcOutput = rpc.createChild(YangConstants.operationOutputQName(
-                        rpc.getLastComponent().getModule()));
-                    bindingResult = resultCodec.fromNormalizedNodeRpcData(rpcOutput, (ContainerNode) domData);
+                    bindingResult = resultCodec.fromNormalizedNodeRpcData(outputPath, (ContainerNode) domData);
                 } else {
                     bindingResult = null;
                 }
@@ -159,8 +158,8 @@ class RpcServiceAdapter implements InvocationHandler {
     }
 
     private final class NonRoutedStrategy extends RpcInvocationStrategy {
-        NonRoutedStrategy(final SchemaPath path) {
-            super(path);
+        NonRoutedStrategy(final QName rpcName) {
+            super(rpcName);
         }
 
         @Override
@@ -173,8 +172,8 @@ class RpcServiceAdapter implements InvocationHandler {
         private final ContextReferenceExtractor refExtractor;
         private final NodeIdentifier contextName;
 
-        RoutedStrategy(final SchemaPath path, final Method rpcMethod, final QName leafName) {
-            super(path);
+        RoutedStrategy(final QName rpcName, final Method rpcMethod, final QName leafName) {
+            super(rpcName);
             final Optional<Class<? extends DataContainer>> maybeInputType =
                     BindingReflections.resolveRpcInputClass(rpcMethod);
             checkState(maybeInputType.isPresent(), "RPC method %s has no input", rpcMethod.getName());
index 57c4845d143435f05458a33f922e02860b7b1e00..597e4cef0982c9b1c8cb1264de7d4f64fca8fb77 100644 (file)
@@ -17,7 +17,7 @@ import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.Grpcont;
 import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.Othercont;
 import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.cont.Foo;
 import org.opendaylight.yang.gen.v1.urn.odl.actions.norev.grpcont.Bar;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 public class ActionLookupTest {
     @Test
@@ -25,9 +25,9 @@ public class ActionLookupTest {
         CurrentAdapterSerializer codec = new CurrentAdapterSerializer(new BindingCodecContext(
             BindingRuntimeHelpers.createRuntimeContext()));
 
-        assertEquals(SchemaPath.create(true, Cont.QNAME, Foo.QNAME), codec.getActionPath(Foo.class));
-        assertEquals(SchemaPath.create(true, Grpcont.QNAME, Bar.QNAME), codec.getActionPath(Bar.class));
-        assertEquals(SchemaPath.create(true, Othercont.QNAME, Bar.QNAME),
+        assertEquals(Absolute.of(Cont.QNAME, Foo.QNAME), codec.getActionPath(Foo.class));
+        assertEquals(Absolute.of(Grpcont.QNAME, Bar.QNAME), codec.getActionPath(Bar.class));
+        assertEquals(Absolute.of(Othercont.QNAME, Bar.QNAME),
             codec.getActionPath(org.opendaylight.yang.gen.v1.urn.odl.actions.norev.othercont.Bar.class));
     }
 }
index 581d5969bcfd2e74c915378aa52dde49fb234125..326b6b2569983c0b6f783344ce4bd3cc23baf3df 100644 (file)
@@ -18,7 +18,6 @@ import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.test.bi.ba.rpcservice.rev140701.OpendaylightTestRpcServiceService;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 public class BindingDOMRpcImplementationAdapterTest {
 
@@ -26,11 +25,10 @@ public class BindingDOMRpcImplementationAdapterTest {
     public void basicTest() throws Exception {
         final BindingDOMCodecServices registry = mock(BindingDOMCodecServices.class);
         final Method testMethod = this.getClass().getDeclaredMethod("testMethod");
-        final SchemaPath schemaPath = SchemaPath.create(true,
-                QName.create(QNameModule.create(new URI("tst")), "test"));
+        final QName rpcType = QName.create(QNameModule.create(new URI("tst")), "test");
         final BindingDOMRpcImplementationAdapter adapter = new BindingDOMRpcImplementationAdapter(
             new ConstantAdapterContext(registry), OpendaylightTestRpcServiceService.class,
-            ImmutableMap.of(schemaPath, testMethod), mock(OpendaylightTestRpcServiceService.class));
+            ImmutableMap.of(rpcType, testMethod), mock(OpendaylightTestRpcServiceService.class));
         assertNotNull(adapter);
     }
 
index 03a6638264e449f64442df80c6b9f60c65fc9cc5..f56b299a3fbc6ada335c13b6d1d9dc29a9bff89d 100644 (file)
@@ -50,14 +50,12 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 public class BindingDOMRpcIntegrationTest {
     private static final InstanceIdentifier<TopLevelList> BA_NODE_ID = InstanceIdentifier.create(Top.class)
             .child(TopLevelList.class, new TopLevelListKey("a"));
 
     private static final QName KNOCK_KNOCK_QNAME = QName.create(KnockKnockOutput.QNAME, "knock-knock");
-    private static final SchemaPath KNOCK_KNOCK_PATH = SchemaPath.create(true, KNOCK_KNOCK_QNAME);
 
     private RpcProviderService baRpcProviderService;
     private RpcConsumerRegistry baRpcConsumerService;
@@ -94,7 +92,7 @@ public class BindingDOMRpcIntegrationTest {
         KnockKnockInput baKnockKnockInput = knockKnock(BA_NODE_ID).setQuestion("who's there?").build();
 
         ContainerNode biKnockKnockInput = toDOMKnockKnockInput(baKnockKnockInput);
-        DOMRpcResult domResult = biRpcService.invokeRpc(KNOCK_KNOCK_PATH, biKnockKnockInput).get(5, TimeUnit.SECONDS);
+        DOMRpcResult domResult = biRpcService.invokeRpc(KNOCK_KNOCK_QNAME, biKnockKnockInput).get(5, TimeUnit.SECONDS);
         assertNotNull(domResult);
         assertNotNull(domResult.getResult());
         assertTrue("Binding KnockKnock service was not invoked",
@@ -110,7 +108,7 @@ public class BindingDOMRpcIntegrationTest {
         biRpcProviderService.registerRpcImplementation((rpc, input) ->
             FluentFutures.immediateFluentFuture(new DefaultDOMRpcResult(testContext.getCodec()
                     .currentSerializer().toNormalizedNodeRpcData(baKnockKnockOutput))),
-            DOMRpcIdentifier.create(KNOCK_KNOCK_PATH, testContext.getCodec().currentSerializer()
+            DOMRpcIdentifier.create(KNOCK_KNOCK_QNAME, testContext.getCodec().currentSerializer()
                 .toYangInstanceIdentifier(BA_NODE_ID)));
 
         final OpendaylightKnockKnockRpcService baKnockService =
index f9b8e2dd0ddcefac5f00df3c2e3646816a75cf1d..2af9eb7a995e7ec1e2ce168ad1230041c40ea8fe 100644 (file)
@@ -31,12 +31,10 @@ import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 public class LazySerializedContainerNodeTest {
     @Test
     public void basicTest() throws Exception {
-        final SchemaPath rpcName;
         final DataObject dataObject = mock(DataObject.class);
         final BindingNormalizedNodeSerializer codec = mock(BindingNormalizedNodeSerializer.class);
         final ContainerNode containerNode = mock(ContainerNode.class);
@@ -50,7 +48,7 @@ public class LazySerializedContainerNodeTest {
 
         final ImmutableBiMap<?, ?> biMap = bindingTestContext.getCodec().currentSerializer()
                 .getRpcMethodToSchema(OpendaylightTestRpcServiceService.class);
-        rpcName = ((RpcDefinition) biMap.values().iterator().next()).getPath();
+        final QName rpcName = ((RpcDefinition) biMap.values().iterator().next()).getQName();
         final LeafNode<?> leafNode = ImmutableLeafNodeBuilder.create().withNodeIdentifier(NodeIdentifier
                 .create(QName.create("", "test"))).withValue("").build();
         final ContainerNode normalizedNode = LazySerializedContainerNode.create(rpcName, dataObject, codec);
@@ -65,7 +63,7 @@ public class LazySerializedContainerNodeTest {
         assertTrue(lazySerializedContainerNode.getValue().isEmpty());
         assertEquals(lazySerializedContainerNode.getIdentifier().getNodeType(),
                 lazySerializedContainerNode.getNodeType());
-        assertEquals(rpcName.getLastComponent(), lazySerializedContainerNode.getIdentifier().getNodeType());
+        assertEquals(rpcName, lazySerializedContainerNode.getIdentifier().getNodeType());
         assertEquals(dataObject, lazySerializedContainerNode.getDataObject());
     }
 }
\ No newline at end of file
index 72ac1385569c5a6798e0fc61f35b896383c194a5..3069084eb99e2ae9b6199e5f81d2f5bf1bcd7a78 100644 (file)
@@ -46,13 +46,11 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 public class Mdsal500Test {
     private static final String FOO = "foo";
 
     private static final QName SWITCH_QNAME = QName.create(SwitchOutput.QNAME, "switch");
-    private static final SchemaPath SWITCH_PATH = SchemaPath.create(true, SWITCH_QNAME);
 
     private RpcProviderService baRpcProviderService;
     private RpcConsumerRegistry baRpcConsumerService;
@@ -86,7 +84,7 @@ public class Mdsal500Test {
         SwitchInput baSwitchInput = switchBuilder(FOO).build();
 
         ContainerNode biSwitchInput = toDOMSwitchInput(baSwitchInput);
-        DOMRpcResult domResult = biRpcService.invokeRpc(SWITCH_PATH, biSwitchInput).get(5, TimeUnit.SECONDS);
+        DOMRpcResult domResult = biRpcService.invokeRpc(SWITCH_QNAME, biSwitchInput).get(5, TimeUnit.SECONDS);
         assertNotNull(domResult);
         assertNotNull(domResult.getResult());
         assertTrue("Binding KnockKnock service was not invoked",
@@ -102,7 +100,7 @@ public class Mdsal500Test {
         biRpcProviderService.registerRpcImplementation((rpc, input) ->
             FluentFutures.immediateFluentFuture(new DefaultDOMRpcResult(testContext.getCodec().currentSerializer()
                     .toNormalizedNodeRpcData(baSwitchOutput))),
-            DOMRpcIdentifier.create(SWITCH_PATH));
+            DOMRpcIdentifier.create(SWITCH_QNAME));
 
         final Mdsal500Service baSwitchService =
                 baRpcConsumerService.getRpcService(Mdsal500Service.class);
index 6252288dce063fa02b3ea5c717145081ad41fc8b..e234d0efbc92119bd5c44f3869fd959fe5423a10 100644 (file)
@@ -25,7 +25,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 /**
  * Serialization service, which provides two-way serialization between Java
@@ -80,7 +80,7 @@ public interface BindingNormalizedNodeSerializer {
      * @param data NormalizedNode representing data
      * @return Binding representation of Notification
      */
-    @Nullable Notification fromNormalizedNodeNotification(@NonNull SchemaPath path, @NonNull ContainerNode data);
+    @Nullable Notification fromNormalizedNodeNotification(@NonNull Absolute path, @NonNull ContainerNode data);
 
     /**
      * Translates supplied NormalizedNode Notification into Binding data, optionally taking an instant
@@ -92,17 +92,17 @@ public interface BindingNormalizedNodeSerializer {
      * @return Binding representation of Notification
      */
     @Beta
-    @Nullable Notification fromNormalizedNodeNotification(@NonNull SchemaPath path, @NonNull ContainerNode data,
+    @Nullable Notification fromNormalizedNodeNotification(@NonNull Absolute path, @NonNull ContainerNode data,
             @Nullable Instant eventInstant);
 
     /**
      * Translates supplied NormalizedNode RPC input or output into Binding data.
      *
-     * @param path Schema path of RPC data, Schema path consists of rpc QName and input / output QName.
+     * @param containerPath Container path (RPC type + input/output)
      * @param data NormalizedNode representing data
      * @return Binding representation of RPC data
      */
-    @Nullable DataObject fromNormalizedNodeRpcData(@NonNull SchemaPath path, @NonNull ContainerNode data);
+    @Nullable DataObject fromNormalizedNodeRpcData(@NonNull Absolute containerPath, @NonNull ContainerNode data);
 
     /**
      * Translates supplied ContainerNode action input.
index 213ae80c6062ddf66ff486b8911075dd0b3ff6f6..800721affd30e55f2223fddc8ef5aff95f526bdb 100644 (file)
@@ -31,7 +31,6 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 @Beta
@@ -96,19 +95,19 @@ public abstract class ForwardingBindingDOMCodecServices extends ForwardingObject
     }
 
     @Override
-    public Notification fromNormalizedNodeNotification(final SchemaPath path, final ContainerNode data) {
+    public Notification fromNormalizedNodeNotification(final Absolute path, final ContainerNode data) {
         return delegate().fromNormalizedNodeNotification(path, data);
     }
 
     @Override
-    public Notification fromNormalizedNodeNotification(final SchemaPath path, final ContainerNode data,
+    public Notification fromNormalizedNodeNotification(final Absolute path, final ContainerNode data,
             final Instant eventInstant) {
         return delegate().fromNormalizedNodeNotification(path, data, eventInstant);
     }
 
     @Override
-    public DataObject fromNormalizedNodeRpcData(final SchemaPath path, final ContainerNode data) {
-        return delegate().fromNormalizedNodeRpcData(path, data);
+    public DataObject fromNormalizedNodeRpcData(final Absolute containerPath, final ContainerNode data) {
+        return delegate().fromNormalizedNodeRpcData(containerPath, data);
     }
 
     @Override
index bd51c859bcdf9654f008f92cca8a031e92da83d4..1a93f7007bba1b2811435e948939ce7fb3424546 100644 (file)
@@ -89,7 +89,6 @@ import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
@@ -331,12 +330,12 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
         return null;
     }
 
-    NotificationCodecContext<?> getNotificationContext(final SchemaPath notification) {
+    NotificationCodecContext<?> getNotificationContext(final Absolute notification) {
         return root.getNotification(notification);
     }
 
-    RpcInputCodec<?> getRpcInputCodec(final SchemaPath path) {
-        return root.getRpc(path);
+    RpcInputCodec<?> getRpcInputCodec(final Absolute containerPath) {
+        return root.getRpc(containerPath);
     }
 
     ActionCodecContext getActionCodec(final Class<? extends Action<?, ?, ?>> action) {
@@ -534,12 +533,12 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
     }
 
     @Override
-    public Notification fromNormalizedNodeNotification(final SchemaPath path, final ContainerNode data) {
+    public Notification fromNormalizedNodeNotification(final Absolute path, final ContainerNode data) {
         return getNotificationContext(path).deserialize(data);
     }
 
     @Override
-    public Notification fromNormalizedNodeNotification(final SchemaPath path, final ContainerNode data,
+    public Notification fromNormalizedNodeNotification(final Absolute path, final ContainerNode data,
             final Instant eventInstant) {
         return eventInstant == null ? fromNormalizedNodeNotification(path, data)
                 : getNotificationContext(path).deserialize(data, eventInstant);
@@ -547,8 +546,8 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri
     }
 
     @Override
-    public DataObject fromNormalizedNodeRpcData(final SchemaPath path, final ContainerNode data) {
-        return getRpcInputCodec(path).deserialize(data);
+    public DataObject fromNormalizedNodeRpcData(final Absolute containerPath, final ContainerNode data) {
+        return getRpcInputCodec(containerPath).deserialize(data);
     }
 
     @Override
index c8200d2ba7fef8a587a6531b52352e521c2adcb7..e00999b7265a928938bc2e99b854d303eeb1edbf 100644 (file)
@@ -48,6 +48,7 @@ import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
 import org.opendaylight.yangtools.yang.model.util.SchemaNodeUtils;
 
@@ -110,11 +111,11 @@ final class SchemaRootCodecContext<D extends DataObject> extends DataContainerCo
                 }
             });
 
-    private final LoadingCache<SchemaPath, RpcInputCodec<?>> rpcDataByPath = CacheBuilder.newBuilder().build(
-        new CacheLoader<SchemaPath, RpcInputCodec<?>>() {
+    private final LoadingCache<Absolute, RpcInputCodec<?>> rpcDataByPath = CacheBuilder.newBuilder().build(
+        new CacheLoader<Absolute, RpcInputCodec<?>>() {
             @Override
-            public RpcInputCodec<?> load(final SchemaPath key) {
-                final ContainerSchemaNode schema = SchemaContextUtil.getRpcDataSchema(getSchema(), key);
+            public RpcInputCodec<?> load(final Absolute key) {
+                final ContainerSchemaNode schema = SchemaContextUtil.getRpcDataSchema(getSchema(), key.asSchemaPath());
                 @SuppressWarnings("unchecked")
                 final Class<? extends DataContainer> cls = (Class<? extends DataContainer>)
                         factory().getRuntimeContext().getClassForSchema(schema);
@@ -122,11 +123,13 @@ final class SchemaRootCodecContext<D extends DataObject> extends DataContainerCo
             }
         });
 
-    private final LoadingCache<SchemaPath, NotificationCodecContext<?>> notificationsByPath = CacheBuilder.newBuilder()
-            .build(new CacheLoader<SchemaPath, NotificationCodecContext<?>>() {
+    private final LoadingCache<Absolute, NotificationCodecContext<?>> notificationsByPath = CacheBuilder.newBuilder()
+            .build(new CacheLoader<Absolute, NotificationCodecContext<?>>() {
                 @Override
-                public NotificationCodecContext<?> load(final SchemaPath key) {
-                    final NotificationDefinition schema = SchemaContextUtil.getNotificationSchema(getSchema(), key);
+                public NotificationCodecContext<?> load(final Absolute key) {
+                    final NotificationDefinition schema = SchemaContextUtil.getNotificationSchema(getSchema(),
+                        // FIXME: do not convert here!
+                        key.asSchemaPath());
                     @SuppressWarnings("unchecked")
                     final Class<? extends Notification> clz = (Class<? extends Notification>)
                             factory().getRuntimeContext().getClassForSchema(schema);
@@ -189,7 +192,7 @@ final class SchemaRootCodecContext<D extends DataObject> extends DataContainerCo
         return getOrRethrow(notificationsByClass, notification);
     }
 
-    NotificationCodecContext<?> getNotification(final SchemaPath notification) {
+    NotificationCodecContext<?> getNotification(final Absolute notification) {
         return getOrRethrow(notificationsByPath, notification);
     }
 
@@ -197,8 +200,8 @@ final class SchemaRootCodecContext<D extends DataObject> extends DataContainerCo
         return getOrRethrow(rpcDataByClass, rpcInputOrOutput);
     }
 
-    RpcInputCodec<?> getRpc(final SchemaPath notification) {
-        return getOrRethrow(rpcDataByPath, notification);
+    RpcInputCodec<?> getRpc(final Absolute containerPath) {
+        return getOrRethrow(rpcDataByPath, containerPath);
     }
 
     DataContainerCodecContext<?,?> createDataTreeChildContext(final Class<?> key) {
index e2a279b4af984e9de8b78853176327cd0905f313..73ebdf9499b18501fe3ecdce90df9d7e4fdce793 100644 (file)
@@ -18,10 +18,10 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 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.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 public class Mdsal552Test extends AbstractBindingCodecTest {
-    private static final SchemaPath OUTPUT_PATH = SchemaPath.create(true, QName.create(RefTestOutput.QNAME, "ref_test"),
+    private static final Absolute OUTPUT_PATH = Absolute.of(QName.create(RefTestOutput.QNAME, "ref_test"),
         RefTestOutput.QNAME);
     private static final QName OUTPUTREF = QName.create(RefTestOutput.QNAME, "outputref");
 
index d71e48266c52da8c727c2104ae83de57c4ed486f..1d20d8d72683cb33e14b801df39c8c9cb64d21ae 100644 (file)
@@ -25,7 +25,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 public class NotificationProcessingTest extends AbstractBindingCodecTest {
     private static final QName NAME = QName.create(TopLevelList.QNAME, "name");
@@ -58,7 +58,7 @@ public class NotificationProcessingTest extends AbstractBindingCodecTest {
 
     @Test
     public void testNormalizedToNotification() {
-        final Notification bindingDeserialized = codecContext.fromNormalizedNodeNotification(SchemaPath.create(true,
+        final Notification bindingDeserialized = codecContext.fromNormalizedNodeNotification(Absolute.of(
             TwoLevelListChanged.QNAME), createTestDomData());
         assertTrue(bindingDeserialized instanceof TwoLevelListChanged);
         assertEquals(createTestBindingData(), bindingDeserialized);
@@ -67,7 +67,7 @@ public class NotificationProcessingTest extends AbstractBindingCodecTest {
     @Test
     public void testNormalizedToNotificationWithInstant() {
         final Instant instant = Instant.now();
-        final Notification bindingDeserialized = codecContext.fromNormalizedNodeNotification(SchemaPath.create(true,
+        final Notification bindingDeserialized = codecContext.fromNormalizedNodeNotification(Absolute.of(
             TwoLevelListChanged.QNAME), createTestDomData(), instant);
         assertTrue(bindingDeserialized instanceof TwoLevelListChanged);
         assertEquals(createTestBindingData(), bindingDeserialized);
@@ -77,7 +77,7 @@ public class NotificationProcessingTest extends AbstractBindingCodecTest {
 
     @Test
     public void testNormalizedToNotificationWithNull() {
-        final Notification bindingDeserialized = codecContext.fromNormalizedNodeNotification(SchemaPath.create(true,
+        final Notification bindingDeserialized = codecContext.fromNormalizedNodeNotification(Absolute.of(
             TwoLevelListChanged.QNAME), createTestDomData(), null);
         assertTrue(bindingDeserialized instanceof TwoLevelListChanged);
         assertEquals(createTestBindingData(), bindingDeserialized);
index 05660598d33669a9f3d59a90d635eaf60d8b8dd2..39541ca1f52758b22136031697ae07f707d07392 100644 (file)
@@ -21,15 +21,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.mdsal.te
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 public class RpcDataSerializationTest extends AbstractBindingCodecTest {
-
     private static final QName PUT_TOP = QName.create(PutTopInput.QNAME, "put-top");
     private static final QName GET_TOP = QName.create(GetTopOutput.QNAME, "get-top");
-
-    private static final SchemaPath PUT_TOP_INPUT = SchemaPath.create(true, PUT_TOP, PutTopInput.QNAME);
-    private static final SchemaPath GET_TOP_OUTPUT = SchemaPath.create(true, GET_TOP, GetTopOutput.QNAME);
+    private static final Absolute PUT_TOP_INPUT = Absolute.of(PUT_TOP, PutTopInput.QNAME);
+    private static final Absolute GET_TOP_OUTPUT = Absolute.of(GET_TOP, GetTopOutput.QNAME);
 
     private static final TopLevelListKey LIST_KEY = new TopLevelListKey("test");
 
index 886ff01094f9fde48b511e80dc4a8becfaa3723a..6026fa8d5f81c34b8eda274b9661ff8c842da5de 100644 (file)
@@ -13,7 +13,7 @@ import java.util.Set;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 /**
  * An {@link DOMActionServiceExtension} exposed by {@link DOMActionService}s which allow their users to listen
@@ -31,7 +31,7 @@ public interface DOMActionAvailabilityExtension extends DOMActionServiceExtensio
      *
      * <p>
      * Users should note that using a listener does not necessarily mean that
-     * {@link DOMActionService#invokeAction(SchemaPath, DOMDataTreeIdentifier, ContainerNode)} will not report
+     * {@link DOMActionService#invokeAction(Absolute, DOMDataTreeIdentifier, ContainerNode)} will not report
      * a failure due to {@link DOMActionNotAvailableException} and need to be ready to handle it.
      *
      * <p>
index 3583247046ee9651b67af2709bdff8b91cc5d9c7..568f424eee0d1eb4571f5eaae4fcea6fecb33afb 100644 (file)
@@ -12,7 +12,7 @@ import com.google.common.util.concurrent.ListenableFuture;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.StoreTreeNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 /**
  * Interface implemented by an individual operation implementation. This API allows for dispatch implementations, e.g.
@@ -27,14 +27,14 @@ public interface DOMActionImplementation {
     /**
      * Initiate invocation of the action. Implementations of this method are expected to not block.
      *
-     * @param type SchemaPath of the action to be invoked. This path refers to an effective action instantiated on top
-     *             of the conceptual {@link StoreTreeNode}.
+     * @param type absolute schema node identifier of the action to be invoked. This path refers to an effective action
+     *             instantiated on top of the conceptual {@link StoreTreeNode}.
      * @param path {@link DOMDataTreeIdentifier} of parent data node which action attached to.
      * @param input Input arguments
      * @return A FluentFuture which completes with the result of invocation
      * @throws NullPointerException if any of the arguments is null
      */
-    ListenableFuture<? extends DOMActionResult> invokeAction(SchemaPath type, DOMDataTreeIdentifier path,
+    ListenableFuture<? extends DOMActionResult> invokeAction(Absolute type, DOMDataTreeIdentifier path,
             ContainerNode input);
 
     /**
index b36bb819005acaf9f8f10e0aacc56cf8400eba30..25c6098a42986f0c52e53b0452e8e13536f867e1 100644 (file)
@@ -18,30 +18,30 @@ import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yangtools.concepts.Immutable;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 /**
  * An action which is subject to availability.
  */
 public final class DOMActionInstance implements Immutable {
     private final Set<DOMDataTreeIdentifier> dataTrees;
-    private final SchemaPath type;
+    private final Absolute type;
 
-    DOMActionInstance(final SchemaPath type, final Set<DOMDataTreeIdentifier> dataTrees) {
+    DOMActionInstance(final Absolute type, final Set<DOMDataTreeIdentifier> dataTrees) {
         this.type = requireNonNull(type);
         this.dataTrees = ImmutableSet.copyOf(dataTrees);
         checkArgument(!dataTrees.isEmpty());
     }
 
-    public static DOMActionInstance of(final SchemaPath type, final Set<DOMDataTreeIdentifier> dataTrees) {
+    public static DOMActionInstance of(final Absolute type, final Set<DOMDataTreeIdentifier> dataTrees) {
         return new DOMActionInstance(type, dataTrees);
     }
 
-    public static DOMActionInstance of(final SchemaPath type, final DOMDataTreeIdentifier... dataTrees) {
+    public static DOMActionInstance of(final Absolute type, final DOMDataTreeIdentifier... dataTrees) {
         return of(type, ImmutableSet.copyOf(dataTrees));
     }
 
-    public static DOMActionInstance of(final SchemaPath type, final LogicalDatastoreType datastore,
+    public static DOMActionInstance of(final Absolute type, final LogicalDatastoreType datastore,
             final YangInstanceIdentifier path) {
         return of(type, ImmutableSet.of(new DOMDataTreeIdentifier(datastore, path)));
     }
@@ -61,7 +61,7 @@ public final class DOMActionInstance implements Immutable {
      *
      * @return operation type.
      */
-    public SchemaPath getType() {
+    public Absolute getType() {
         return type;
     }
 
index 75499fed94f14122694969dc3f835f7b80994a44..c8d684586c5a2f9a9420a4f81695109e809b9e47 100644 (file)
@@ -12,7 +12,7 @@ import com.google.common.util.concurrent.ListenableFuture;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.StoreTreeNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 /**
  * A {@link DOMService} which allows clients to invoke Actions. The conceptual model of this service is that
@@ -26,13 +26,13 @@ public interface DOMActionService extends DOMExtensibleService<DOMActionService,
     /**
      * Initiate invocation of an Action. This method is guaranteed to not block on any external resources.
      *
-     * @param type SchemaPath of the action to be invoked. This path refers to an effective action instantiated on top
-     *             of the conceptual {@link StoreTreeNode}.
+     * @param type Absolute schema node identifier of the action to be invoked. This path refers to an effective action
+     *             instantiated on top of the conceptual {@link StoreTreeNode}.
      * @param path {@link DOMDataTreeIdentifier} of parent data node which action attached to.
      * @param input Input argument
      * @return A FluentFuture which completes with the result of invocation
      * @throws NullPointerException if any of the arguments is null
      */
-    ListenableFuture<? extends DOMActionResult> invokeAction(SchemaPath type, DOMDataTreeIdentifier path,
+    ListenableFuture<? extends DOMActionResult> invokeAction(Absolute type, DOMDataTreeIdentifier path,
             ContainerNode input);
 }
index 675e1e286904ea1c1241a5d4e5d116221e824fee..9d2c58c5ba7e41bf0c285e069efb868980476ba7 100644 (file)
@@ -9,7 +9,7 @@ package org.opendaylight.mdsal.dom.api;
 
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 /**
  * A single YANG notification. This interface captures the data portion of a notification. Implementations may choose
@@ -23,7 +23,7 @@ public interface DOMNotification {
      *
      * @return Notification type.
      */
-    @NonNull SchemaPath getType();
+    @NonNull Absolute getType();
 
     /**
      * Return the body of this notification.
index 46f0f44a60bb49cc371844e250af0dc61884d775..666f125b0e6856afa8df62537831d28ad8ea61b4 100644 (file)
@@ -11,7 +11,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 /**
  * A {@link DOMService} which allows its users to subscribe to receive
@@ -29,11 +29,11 @@ public interface DOMNotificationService extends DOMService {
      * @return Registration handle. Invoking {@link ListenerRegistration#close()} will stop the
      *         delivery of notifications to the listener
      * @throws IllegalArgumentException if types is empty or contains an invalid element, such as
-     *         null or a SchemaPath which does not represent a valid {@link DOMNotification} type.
+     *         null or a schema node identifier which does not represent a valid {@link DOMNotification} type.
      * @throws NullPointerException if either of the arguments is null
      */
     <T extends DOMNotificationListener> ListenerRegistration<T>
-            registerNotificationListener(@NonNull T listener, @NonNull Collection<SchemaPath> types);
+            registerNotificationListener(@NonNull T listener, @NonNull Collection<Absolute> types);
 
     /**
      * Register a {@link DOMNotificationListener} to receive a set of notifications. As with other
@@ -46,11 +46,11 @@ public interface DOMNotificationService extends DOMService {
      * @return Registration handle. Invoking {@link ListenerRegistration#close()} will stop the
      *         delivery of notifications to the listener
      * @throws IllegalArgumentException if types is empty or contains an invalid element, such as
-     *         null or a SchemaPath which does not represent a valid {@link DOMNotification} type.
+     *         null or a schema node identifier which does not represent a valid {@link DOMNotification} type.
      * @throws NullPointerException if listener is null
      */
     default <T extends DOMNotificationListener> ListenerRegistration<T>
-            registerNotificationListener(@NonNull final T listener, final SchemaPath... types) {
+            registerNotificationListener(@NonNull final T listener, final Absolute... types) {
         return registerNotificationListener(listener, Arrays.asList(types));
     }
 }
index 0cf0a4ab7dd63244b5f1ac600f95feec6b374419..157f65f9527e065f0922435ecebbd2d7d57a744b 100644 (file)
@@ -13,8 +13,8 @@ import com.google.common.base.MoreObjects;
 import java.util.Objects;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 /**
  * Identifier of a RPC context. This is an extension of the YANG RPC, which always has global context. It allows an RPC
@@ -24,7 +24,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 @NonNullByDefault
 public abstract class DOMRpcIdentifier {
     private static final class Global extends DOMRpcIdentifier {
-        private Global(final SchemaPath type) {
+        private Global(final QName type) {
             super(type);
         }
 
@@ -37,7 +37,7 @@ public abstract class DOMRpcIdentifier {
     private static final class Local extends DOMRpcIdentifier {
         private final YangInstanceIdentifier contextReference;
 
-        private Local(final SchemaPath type, final YangInstanceIdentifier contextReference) {
+        private Local(final QName type, final YangInstanceIdentifier contextReference) {
             super(type);
             this.contextReference = requireNonNull(contextReference);
         }
@@ -48,31 +48,30 @@ public abstract class DOMRpcIdentifier {
         }
     }
 
-    private final SchemaPath type;
+    private final QName type;
 
-    private DOMRpcIdentifier(final SchemaPath type) {
+    private DOMRpcIdentifier(final QName type) {
         this.type = requireNonNull(type);
     }
 
     /**
      * Create a global RPC identifier.
      *
-     * @param type RPC type, SchemaPath of its definition, may not be null
+     * @param type RPC type, schema node identifier of its definition, may not be null
      * @return A global RPC identifier, guaranteed to be non-null.
      */
-    public static DOMRpcIdentifier create(final SchemaPath type) {
+    public static DOMRpcIdentifier create(final QName type) {
         return new Global(type);
     }
 
     /**
      * Create an RPC identifier with a particular context reference.
      *
-     * @param type RPC type, SchemaPath of its definition, may not be null
+     * @param type RPC type, schema node identifier of its definition, may not be null
      * @param contextReference Context reference, null means a global RPC identifier.
      * @return A global RPC identifier, guaranteed to be non-null.
      */
-    public static DOMRpcIdentifier create(final SchemaPath type,
-            final @Nullable YangInstanceIdentifier contextReference) {
+    public static DOMRpcIdentifier create(final QName type, final @Nullable YangInstanceIdentifier contextReference) {
         if (contextReference == null || contextReference.isEmpty()) {
             return new Global(type);
         }
@@ -85,7 +84,7 @@ public abstract class DOMRpcIdentifier {
      *
      * @return RPC type.
      */
-    public final SchemaPath getType() {
+    public final QName getType() {
         return type;
     }
 
index a6b103cb4338f84ad74ec3c3f3d416adb78c8f8e..1fac49526a0a1045c22da5b064a57fac2490c949 100644 (file)
@@ -10,8 +10,8 @@ package org.opendaylight.mdsal.dom.api;
 import com.google.common.util.concurrent.ListenableFuture;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 /**
  * A {@link DOMService} which allows clients to invoke RPCs. The conceptual model of this service is that of a dynamic
@@ -24,12 +24,12 @@ public interface DOMRpcService extends DOMService {
      * Initiate invocation of an RPC. This method is guaranteed to not block on any external
      * resources.
      *
-     * @param type SchemaPath of the RPC to be invoked
+     * @param type QName of the RPC to be invoked
      * @param input Input arguments, null if the RPC does not take any.
      * @return A {@link ListenableFuture} which will return either a result structure, or report a subclass
      *         of {@link DOMRpcException} reporting a transport error.
      */
-    @NonNull ListenableFuture<? extends DOMRpcResult> invokeRpc(@NonNull SchemaPath type,
+    @NonNull ListenableFuture<? extends DOMRpcResult> invokeRpc(@NonNull QName type,
             @NonNull NormalizedNode<?, ?> input);
 
     /**
@@ -37,7 +37,7 @@ public interface DOMRpcService extends DOMService {
      * about RPC implementations becoming (un)available. The listener will be invoked with the
      * current implementations reported and will be kept uptodate as implementations come and go.
      * Users should note that using a listener does not necessarily mean that
-     * {@link #invokeRpc(SchemaPath, NormalizedNode)} will not report a failure due to
+     * {@link #invokeRpc(QName, NormalizedNode)} will not report a failure due to
      * {@link DOMRpcImplementationNotAvailableException} and need to be ready to handle it.
      * Implementations are encouraged to take reasonable precautions to prevent this scenario from
      * occurring.
index a1c8142cb2b1b5b331a3e2b3309afa822b273e90..3e5b232d9d3b94b38a3cd6a88a32b3d691e0f4b2 100644 (file)
@@ -18,15 +18,16 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 public class DOMRpcIdentifierTest {
     private static final String LOCAL_IDENT = "local";
     private static final QNameModule TEST_MODULE = QNameModule.create(URI.create(
             "urn:opendaylight:params:xml:ns:yang:controller:md:sal:test:store"));
-    private static final DOMRpcIdentifier GLOBAL = DOMRpcIdentifier.create(SchemaPath.SAME, null);
-    private static final DOMRpcIdentifier LOCAL = DOMRpcIdentifier.create(SchemaPath.ROOT,YangInstanceIdentifier.create(
-            new NodeIdentifier(QName.create(TEST_MODULE, LOCAL_IDENT))));
+    private static final QName LOCAL_QNAME = QName.create(TEST_MODULE, LOCAL_IDENT);
+
+    private static final DOMRpcIdentifier GLOBAL = DOMRpcIdentifier.create(LOCAL_QNAME, null);
+    private static final DOMRpcIdentifier LOCAL = DOMRpcIdentifier.create(LOCAL_QNAME,
+        YangInstanceIdentifier.create(new NodeIdentifier(LOCAL_QNAME)));
 
     @Test
     public void createTest() {
@@ -36,13 +37,13 @@ public class DOMRpcIdentifierTest {
 
     @Test
     public void hashCodeTest() {
-        assertEquals("hashCode", GLOBAL.hashCode(), DOMRpcIdentifier.create(SchemaPath.ROOT).hashCode());
+        assertEquals("hashCode", GLOBAL.hashCode(), DOMRpcIdentifier.create(LOCAL_QNAME).hashCode());
         assertNotEquals("hashCode", GLOBAL.hashCode(), LOCAL.hashCode());
     }
 
     @Test
     public void equalsTest() {
-        assertTrue("Equals same", GLOBAL.equals(DOMRpcIdentifier.create(SchemaPath.SAME)));
+        assertTrue("Equals same", GLOBAL.equals(DOMRpcIdentifier.create(LOCAL_QNAME)));
         assertTrue("Equals same instance", GLOBAL.equals(GLOBAL));
         assertFalse("Different object", GLOBAL.equals(new Object()));
         assertFalse("Different instance", GLOBAL.equals(LOCAL));
index ae81b34fd4a26e8e3a1d5a76dc0fe1c8a5a355aa..f0fac75ded532a24998ffb75f29cea94247c0293 100644 (file)
@@ -27,7 +27,6 @@ import java.util.Set;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 /**
  * Abstract routing table definition for Action and RPC.
@@ -36,24 +35,24 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
  * @param <M> implementation type of RPC or Acton
  * @param <L> listener type of RPC or Acton
  * @param <E> routing entry type of RPC or Acton
+ * @param <K> routing key type
  */
 @Beta
-abstract class AbstractDOMRoutingTable<I, D, M, L extends EventListener,
-        E extends AbstractDOMRoutingTableEntry<D, M, L>> {
-    private final Map<SchemaPath, E> operations;
+abstract class AbstractDOMRoutingTable<I, D, M, L extends EventListener, K,
+        E extends AbstractDOMRoutingTableEntry<D, M, L, K>> {
+    private final Map<K, E> operations;
     private final EffectiveModelContext schemaContext;
 
-    AbstractDOMRoutingTable(final Map<SchemaPath, E> operations, final EffectiveModelContext schemaContext) {
+    AbstractDOMRoutingTable(final Map<K, E> operations, final EffectiveModelContext schemaContext) {
         this.operations = requireNonNull(operations);
         this.schemaContext = schemaContext;
     }
 
-    AbstractDOMRoutingTable<I, D, M, L, E> setSchemaContext(final EffectiveModelContext context) {
-        final Builder<SchemaPath, E> b = ImmutableMap.builder();
+    AbstractDOMRoutingTable<I, D, M, L, K, E> setSchemaContext(final EffectiveModelContext context) {
+        final Builder<K, E> b = ImmutableMap.builder();
 
-        for (Entry<SchemaPath, E> e : operations.entrySet()) {
-            final E entry = createOperationEntry(context, e.getKey(),
-                e.getValue().getImplementations());
+        for (Entry<K, E> e : operations.entrySet()) {
+            final E entry = createOperationEntry(context, e.getKey(), e.getValue().getImplementations());
             if (entry != null) {
                 b.put(e.getKey(), entry);
             }
@@ -62,17 +61,17 @@ abstract class AbstractDOMRoutingTable<I, D, M, L extends EventListener,
         return newInstance(b.build(), context);
     }
 
-    AbstractDOMRoutingTable<I, D, M, L, E> add(final M implementation, final Set<I> oprsToAdd) {
+    AbstractDOMRoutingTable<I, D, M, L, K, E> add(final M implementation, final Set<I> oprsToAdd) {
         if (oprsToAdd.isEmpty()) {
             return this;
         }
 
         // First decompose the identifiers to a multimap
-        final ListMultimap<SchemaPath, D> toAdd = decomposeIdentifiers(oprsToAdd);
+        final ListMultimap<K, D> toAdd = decomposeIdentifiers(oprsToAdd);
 
         // Now iterate over existing entries, modifying them as appropriate...
-        final Builder<SchemaPath, E> mb = ImmutableMap.builder();
-        for (Entry<SchemaPath, E> re : this.operations.entrySet()) {
+        final Builder<K, E> mb = ImmutableMap.builder();
+        for (Entry<K, E> re : this.operations.entrySet()) {
             List<D> newOperations = new ArrayList<>(toAdd.removeAll(re.getKey()));
             if (!newOperations.isEmpty()) {
                 final E ne = (E) re.getValue().add(implementation, newOperations);
@@ -83,7 +82,7 @@ abstract class AbstractDOMRoutingTable<I, D, M, L extends EventListener,
         }
 
         // Finally add whatever is left in the decomposed multimap
-        for (Entry<SchemaPath, Collection<D>> e : toAdd.asMap().entrySet()) {
+        for (Entry<K, Collection<D>> e : toAdd.asMap().entrySet()) {
             final Builder<D, List<M>> vb = ImmutableMap.builder();
             final List<M> v = ImmutableList.of(implementation);
             for (D i : e.getValue()) {
@@ -100,17 +99,17 @@ abstract class AbstractDOMRoutingTable<I, D, M, L extends EventListener,
         return newInstance(mb.build(), schemaContext);
     }
 
-    AbstractDOMRoutingTable<I, D, M, L, E> remove(final M implementation, final Set<I> instances) {
+    AbstractDOMRoutingTable<I, D, M, L, K, E> remove(final M implementation, final Set<I> instances) {
         if (instances.isEmpty()) {
             return this;
         }
 
         // First decompose the identifiers to a multimap
-        final ListMultimap<SchemaPath, D> toRemove = decomposeIdentifiers(instances);
+        final ListMultimap<K, D> toRemove = decomposeIdentifiers(instances);
 
         // Now iterate over existing entries, modifying them as appropriate...
-        final Builder<SchemaPath, E> b = ImmutableMap.builder();
-        for (Entry<SchemaPath, E> e : this.operations.entrySet()) {
+        final Builder<K, E> b = ImmutableMap.builder();
+        for (Entry<K, E> e : this.operations.entrySet()) {
             final List<D> removed = new ArrayList<>(toRemove.removeAll(e.getKey()));
             if (!removed.isEmpty()) {
                 final E ne = (E) e.getValue().remove(implementation, removed);
@@ -127,13 +126,13 @@ abstract class AbstractDOMRoutingTable<I, D, M, L extends EventListener,
     }
 
     @VisibleForTesting
-    Map<SchemaPath, Set<D>> getOperations() {
+    Map<K, Set<D>> getOperations() {
         return Maps.transformValues(operations, AbstractDOMRoutingTableEntry::registeredIdentifiers);
     }
 
-    Map<SchemaPath, Set<D>> getOperations(final L listener) {
-        final Map<SchemaPath, Set<D>> ret = new HashMap<>(operations.size());
-        for (Entry<SchemaPath, E> e : operations.entrySet()) {
+    Map<K, Set<D>> getOperations(final L listener) {
+        final Map<K, Set<D>> ret = new HashMap<>(operations.size());
+        for (Entry<K, E> e : operations.entrySet()) {
             final Set<D> ids = e.getValue().registeredIdentifiers(listener);
             if (!ids.isEmpty()) {
                 ret.put(e.getKey(), ids);
@@ -143,14 +142,14 @@ abstract class AbstractDOMRoutingTable<I, D, M, L extends EventListener,
         return ret;
     }
 
-    @Nullable AbstractDOMRoutingTableEntry<D, M, L> getEntry(final @NonNull SchemaPath type) {
+    @Nullable AbstractDOMRoutingTableEntry<D, M, L, K> getEntry(final @NonNull K type) {
         return operations.get(type);
     }
 
-    protected abstract AbstractDOMRoutingTable<I, D, M, L, E> newInstance(Map<SchemaPath, E> operations,
+    protected abstract AbstractDOMRoutingTable<I, D, M, L, K, E> newInstance(Map<K, E> operations,
             EffectiveModelContext schemaContext);
 
-    abstract ListMultimap<SchemaPath, D> decomposeIdentifiers(Set<I> instances);
+    abstract ListMultimap<K, D> decomposeIdentifiers(Set<I> instances);
 
-    abstract E createOperationEntry(EffectiveModelContext context, SchemaPath key, Map<D, List<M>> implementations);
+    abstract E createOperationEntry(EffectiveModelContext context, K key, Map<D, List<M>> implementations);
 }
index f227b122fdb81f5cc67efebcf3a06c6af067aff3..dfc71580e3bc4a99c0bfbc142ab4607cb6902508 100644 (file)
@@ -20,25 +20,25 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 /**
  * Abstract routing table entry definition for Action and RPC.
  * @param <D> identifier type of RPC or Acton
  * @param <M> implementation type of RPC or Acton
  * @param <L> listener type of RPC or Acton
+ * @param <K> routing key type
  */
 @Beta
-abstract class AbstractDOMRoutingTableEntry<D, M, L extends EventListener> {
+abstract class AbstractDOMRoutingTableEntry<D, M, L extends EventListener, K> {
     private final Map<D, List<M>> implementations;
-    private final SchemaPath type;
+    private final K type;
 
-    AbstractDOMRoutingTableEntry(final SchemaPath type, final Map<D, List<M>> implementations) {
+    AbstractDOMRoutingTableEntry(final K type, final Map<D, List<M>> implementations) {
         this.type = requireNonNull(type);
         this.implementations = requireNonNull(implementations);
     }
 
-    SchemaPath getType() {
+    K getType() {
         return type;
     }
 
@@ -64,7 +64,7 @@ abstract class AbstractDOMRoutingTableEntry<D, M, L extends EventListener> {
      * @param newOprs  the List of new RPCs/Actions that the DOMOperationImplementation provides, must be mutable
      * @return a new instance of DOMActionRoutingTableEntry with the additions
      */
-    AbstractDOMRoutingTableEntry<D, M, L> add(final M implementation, final List<D> newOprs) {
+    AbstractDOMRoutingTableEntry<D, M, L, K> add(final M implementation, final List<D> newOprs) {
         final Builder<D, List<M>> vb = ImmutableMap.builder();
         for (final Entry<D, List<M>> ve : implementations.entrySet()) {
             if (newOprs.remove(ve.getKey())) {
@@ -89,7 +89,7 @@ abstract class AbstractDOMRoutingTableEntry<D, M, L extends EventListener> {
         return newInstance(vb.build());
     }
 
-    AbstractDOMRoutingTableEntry<D, M, L> remove(final M implementation, final List<D> removed) {
+    AbstractDOMRoutingTableEntry<D, M, L, K> remove(final M implementation, final List<D> removed) {
         final Builder<D, List<M>> vb = ImmutableMap.builder();
         for (final Entry<D, List<M>> ve : implementations.entrySet()) {
             if (removed.remove(ve.getKey())) {
@@ -111,5 +111,5 @@ abstract class AbstractDOMRoutingTableEntry<D, M, L extends EventListener> {
 
     protected abstract Comparator<M> implComparator();
 
-    protected abstract AbstractDOMRoutingTableEntry<D, M, L> newInstance(Map<D, List<M>> impls);
+    protected abstract AbstractDOMRoutingTableEntry<D, M, L, K> newInstance(Map<D, List<M>> impls);
 }
index a4fab0c762f342c3dc0bd43495f1a981c42d62b0..72bbc5e17d39da20bccb2a7177f7e23fab5c1c18 100644 (file)
@@ -17,14 +17,15 @@ import java.util.Set;
 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;
 
 abstract class AbstractDOMRpcRoutingTableEntry extends AbstractDOMRoutingTableEntry<YangInstanceIdentifier,
-        DOMRpcImplementation, DOMRpcAvailabilityListener> {
+        DOMRpcImplementation, DOMRpcAvailabilityListener, QName> {
     private final DOMRpcIdentifier rpcId;
 
-    AbstractDOMRpcRoutingTableEntry(final DOMRpcIdentifier rpcId, final Map<YangInstanceIdentifier,
-        List<DOMRpcImplementation>> implementations) {
+    AbstractDOMRpcRoutingTableEntry(final DOMRpcIdentifier rpcId,
+            final Map<YangInstanceIdentifier, List<DOMRpcImplementation>> implementations) {
         super(rpcId.getType(), implementations);
         this.rpcId = requireNonNull(rpcId);
     }
index 58669acfa4e0cfa68c08200bd3636d8ce8284eca..0b6b7e12bcca08839af2136ebde9003ba31c9e45 100644 (file)
@@ -24,32 +24,32 @@ import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
 
-
 /**
  * Definition of Action routing table.
  */
 @Beta
 final class DOMActionRoutingTable extends AbstractDOMRoutingTable<DOMActionInstance, DOMDataTreeIdentifier,
-        DOMActionImplementation, AvailabilityListener, DOMActionRoutingTableEntry> {
+        DOMActionImplementation, AvailabilityListener, Absolute, DOMActionRoutingTableEntry> {
     static final DOMActionRoutingTable EMPTY = new DOMActionRoutingTable(ImmutableMap.of(), null);
 
-    private DOMActionRoutingTable(final Map<SchemaPath, DOMActionRoutingTableEntry> actions,
+    private DOMActionRoutingTable(final Map<Absolute, DOMActionRoutingTableEntry> actions,
             final EffectiveModelContext schemaContext) {
         super(actions, schemaContext);
     }
 
     @Override
-    protected DOMActionRoutingTable newInstance(final Map<SchemaPath, DOMActionRoutingTableEntry> operations,
+    protected DOMActionRoutingTable newInstance(final Map<Absolute, DOMActionRoutingTableEntry> operations,
             final EffectiveModelContext schemaContext) {
         return new DOMActionRoutingTable(operations, schemaContext);
     }
 
     @Override
-    protected ListMultimap<SchemaPath, DOMDataTreeIdentifier> decomposeIdentifiers(
+    protected ListMultimap<Absolute, DOMDataTreeIdentifier> decomposeIdentifiers(
             final Set<DOMActionInstance> instances) {
-        final ListMultimap<SchemaPath, DOMDataTreeIdentifier> ret = LinkedListMultimap.create();
+        final ListMultimap<Absolute, DOMDataTreeIdentifier> ret = LinkedListMultimap.create();
         for (DOMActionInstance instance : instances) {
             instance.getDataTrees().forEach(id -> ret.put(instance.getType(), id));
         }
@@ -58,7 +58,7 @@ final class DOMActionRoutingTable extends AbstractDOMRoutingTable<DOMActionInsta
 
     @Override
     protected DOMActionRoutingTableEntry createOperationEntry(final EffectiveModelContext context,
-            final SchemaPath type, final Map<DOMDataTreeIdentifier, List<DOMActionImplementation>> implementations) {
+            final Absolute type, final Map<DOMDataTreeIdentifier, List<DOMActionImplementation>> implementations) {
         final ActionDefinition actionDef = findActionDefinition(context, type);
         if (actionDef == null) {
             //FIXME: return null directly instead of providing kind of unknown entry.
@@ -68,10 +68,12 @@ final class DOMActionRoutingTable extends AbstractDOMRoutingTable<DOMActionInsta
         return new DOMActionRoutingTableEntry(type, implementations);
     }
 
-    private static ActionDefinition findActionDefinition(final SchemaContext context, final SchemaPath path) {
-        final SchemaNode node = SchemaContextUtil.findDataSchemaNode(context, path.getParent());
+    private static ActionDefinition findActionDefinition(final SchemaContext context, final Absolute path) {
+        // FIXME: use direct search
+        final SchemaPath legacy = path.asSchemaPath();
+        final SchemaNode node = SchemaContextUtil.findDataSchemaNode(context, legacy.getParent());
         if (node instanceof ActionNodeContainer) {
-            return ((ActionNodeContainer) node).findAction(path.getLastComponent()).orElse(null);
+            return ((ActionNodeContainer) node).findAction(legacy.getLastComponent()).orElse(null);
         }
         return null;
     }
index f44d884b66fc912d7aa000396784a226fa9be9cd..33bd80a285acfd6fdbf1127f3ae21fa9ce744ce8 100644 (file)
@@ -16,15 +16,15 @@ import java.util.Set;
 import org.opendaylight.mdsal.dom.api.DOMActionAvailabilityExtension.AvailabilityListener;
 import org.opendaylight.mdsal.dom.api.DOMActionImplementation;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 /**
  * Definition of Action routing table entry.
  */
 @Beta
 final class DOMActionRoutingTableEntry extends AbstractDOMRoutingTableEntry<DOMDataTreeIdentifier,
-        DOMActionImplementation, AvailabilityListener> {
-    DOMActionRoutingTableEntry(final SchemaPath type,
+        DOMActionImplementation, AvailabilityListener, Absolute> {
+    DOMActionRoutingTableEntry(final Absolute type,
             final Map<DOMDataTreeIdentifier, List<DOMActionImplementation>> implementations) {
         super(type, implementations);
     }
@@ -42,7 +42,7 @@ final class DOMActionRoutingTableEntry extends AbstractDOMRoutingTableEntry<DOMD
 
     @Override
     protected DOMActionRoutingTableEntry newInstance(
-        Map<DOMDataTreeIdentifier, List<DOMActionImplementation>> impls) {
+            final Map<DOMDataTreeIdentifier, List<DOMActionImplementation>> impls) {
         return new DOMActionRoutingTableEntry(getType(), impls);
     }
 }
index d7ee230c3b5ecafc25d2d0d45804298637431f6a..6d524a1ab49aa6c237413959a9342b447928d9f4 100644 (file)
@@ -41,7 +41,7 @@ import org.opendaylight.yangtools.concepts.AbstractListenerRegistration;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.util.ListenerRegistry;
 import org.opendaylight.yangtools.util.concurrent.FluentFutures;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -81,7 +81,7 @@ public class DOMNotificationRouter implements AutoCloseable, DOMNotificationPubl
     private final ScheduledThreadPoolExecutor observer;
     private final ExecutorService executor;
 
-    private volatile Multimap<SchemaPath, AbstractListenerRegistration<? extends DOMNotificationListener>> listeners =
+    private volatile Multimap<Absolute, AbstractListenerRegistration<? extends DOMNotificationListener>> listeners =
             ImmutableMultimap.of();
 
     @VisibleForTesting
@@ -111,7 +111,7 @@ public class DOMNotificationRouter implements AutoCloseable, DOMNotificationPubl
 
     @Override
     public synchronized <T extends DOMNotificationListener> ListenerRegistration<T> registerNotificationListener(
-            final T listener, final Collection<SchemaPath> types) {
+            final T listener, final Collection<Absolute> types) {
         final AbstractListenerRegistration<T> reg = new AbstractListenerRegistration<>(listener) {
             @Override
             protected void removeRegistration() {
@@ -123,11 +123,11 @@ public class DOMNotificationRouter implements AutoCloseable, DOMNotificationPubl
         };
 
         if (!types.isEmpty()) {
-            final Builder<SchemaPath, AbstractListenerRegistration<? extends DOMNotificationListener>> b =
+            final Builder<Absolute, AbstractListenerRegistration<? extends DOMNotificationListener>> b =
                     ImmutableMultimap.builder();
             b.putAll(listeners);
 
-            for (final SchemaPath t : types) {
+            for (final Absolute t : types) {
                 b.put(t, reg);
             }
 
@@ -143,13 +143,13 @@ public class DOMNotificationRouter implements AutoCloseable, DOMNotificationPubl
      * @param newListeners is used to notify listenerTypes changed
      */
     private void replaceListeners(
-            final Multimap<SchemaPath, AbstractListenerRegistration<? extends DOMNotificationListener>> newListeners) {
+            final Multimap<Absolute, AbstractListenerRegistration<? extends DOMNotificationListener>> newListeners) {
         listeners = newListeners;
         notifyListenerTypesChanged(newListeners.keySet());
     }
 
     @SuppressWarnings("checkstyle:IllegalCatch")
-    private void notifyListenerTypesChanged(final Set<SchemaPath> typesAfter) {
+    private void notifyListenerTypesChanged(final Set<Absolute> typesAfter) {
         final List<? extends DOMNotificationSubscriptionListener> listenersAfter =
                 subscriptionListeners.streamListeners().collect(ImmutableList.toImmutableList());
         executor.execute(() -> {
@@ -166,7 +166,7 @@ public class DOMNotificationRouter implements AutoCloseable, DOMNotificationPubl
     @Override
     public <L extends DOMNotificationSubscriptionListener> ListenerRegistration<L> registerSubscriptionListener(
             final L listener) {
-        final Set<SchemaPath> initialTypes = listeners.keySet();
+        final Set<Absolute> initialTypes = listeners.keySet();
         executor.execute(() -> listener.onSubscriptionChanged(initialTypes));
         return subscriptionListeners.register(listener);
     }
@@ -263,7 +263,7 @@ public class DOMNotificationRouter implements AutoCloseable, DOMNotificationPubl
     }
 
     @VisibleForTesting
-    Multimap<SchemaPath, ?> listeners() {
+    Multimap<Absolute, ?> listeners() {
         return listeners;
     }
 
index f1fa5a70de1cf0f8a4bb03f6a4af3ea049732181..53ed7b3d73099deae759ef15b9eef934e7624188 100644 (file)
@@ -68,13 +68,14 @@ import org.opendaylight.yangtools.concepts.AbstractObjectRegistration;
 import org.opendaylight.yangtools.concepts.AbstractRegistration;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.concepts.ObjectRegistration;
+import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -218,11 +219,10 @@ public final class DOMRpcRouter extends AbstractRegistration
     private static final class Registration<T extends DOMRpcAvailabilityListener>
         extends AbstractListenerRegistration<T> {
 
-        private Map<SchemaPath, Set<YangInstanceIdentifier>> prevRpcs;
+        private Map<QName, Set<YangInstanceIdentifier>> prevRpcs;
         private DOMRpcRouter router;
 
-        Registration(final DOMRpcRouter router, final T listener,
-                final Map<SchemaPath, Set<YangInstanceIdentifier>> rpcs) {
+        Registration(final DOMRpcRouter router, final T listener, final Map<QName, Set<YangInstanceIdentifier>> rpcs) {
             super(listener);
             this.router = requireNonNull(router);
             this.prevRpcs = requireNonNull(rpcs);
@@ -236,7 +236,7 @@ public final class DOMRpcRouter extends AbstractRegistration
 
         void initialTable() {
             final Collection<DOMRpcIdentifier> added = new ArrayList<>();
-            for (Entry<SchemaPath, Set<YangInstanceIdentifier>> e : prevRpcs.entrySet()) {
+            for (Entry<QName, Set<YangInstanceIdentifier>> e : prevRpcs.entrySet()) {
                 added.addAll(Collections2.transform(e.getValue(), i -> DOMRpcIdentifier.create(e.getKey(), i)));
             }
             if (!added.isEmpty()) {
@@ -250,15 +250,14 @@ public final class DOMRpcRouter extends AbstractRegistration
                 return;
             }
 
-            final Map<SchemaPath, Set<YangInstanceIdentifier>> rpcs = verifyNotNull(newTable.getOperations(l));
-            final MapDifference<SchemaPath, Set<YangInstanceIdentifier>> diff = Maps.difference(prevRpcs, rpcs);
+            final Map<QName, Set<YangInstanceIdentifier>> rpcs = verifyNotNull(newTable.getOperations(l));
+            final MapDifference<QName, Set<YangInstanceIdentifier>> diff = Maps.difference(prevRpcs, rpcs);
 
             final Collection<DOMRpcIdentifier> added = new ArrayList<>();
-            for (Entry<SchemaPath, Set<YangInstanceIdentifier>> e : diff.entriesOnlyOnRight().entrySet()) {
+            for (Entry<QName, Set<YangInstanceIdentifier>> e : diff.entriesOnlyOnRight().entrySet()) {
                 added.addAll(Collections2.transform(e.getValue(), i -> DOMRpcIdentifier.create(e.getKey(), i)));
             }
-            for (Entry<SchemaPath, ValueDifference<Set<YangInstanceIdentifier>>> e :
-                    diff.entriesDiffering().entrySet()) {
+            for (Entry<QName, ValueDifference<Set<YangInstanceIdentifier>>> e : diff.entriesDiffering().entrySet()) {
                 for (YangInstanceIdentifier i : Sets.difference(e.getValue().rightValue(), e.getValue().leftValue())) {
                     added.add(DOMRpcIdentifier.create(e.getKey(), i));
                 }
@@ -276,15 +275,14 @@ public final class DOMRpcRouter extends AbstractRegistration
                 return;
             }
 
-            final Map<SchemaPath, Set<YangInstanceIdentifier>> rpcs = verifyNotNull(newTable.getOperations(l));
-            final MapDifference<SchemaPath, Set<YangInstanceIdentifier>> diff = Maps.difference(prevRpcs, rpcs);
+            final Map<QName, Set<YangInstanceIdentifier>> rpcs = verifyNotNull(newTable.getOperations(l));
+            final MapDifference<QName, Set<YangInstanceIdentifier>> diff = Maps.difference(prevRpcs, rpcs);
 
             final Collection<DOMRpcIdentifier> removed = new ArrayList<>();
-            for (Entry<SchemaPath, Set<YangInstanceIdentifier>> e : diff.entriesOnlyOnLeft().entrySet()) {
+            for (Entry<QName, Set<YangInstanceIdentifier>> e : diff.entriesOnlyOnLeft().entrySet()) {
                 removed.addAll(Collections2.transform(e.getValue(), i -> DOMRpcIdentifier.create(e.getKey(), i)));
             }
-            for (Entry<SchemaPath, ValueDifference<Set<YangInstanceIdentifier>>> e :
-                    diff.entriesDiffering().entrySet()) {
+            for (Entry<QName, ValueDifference<Set<YangInstanceIdentifier>>> e : diff.entriesDiffering().entrySet()) {
                 for (YangInstanceIdentifier i : Sets.difference(e.getValue().leftValue(), e.getValue().rightValue())) {
                     removed.add(DOMRpcIdentifier.create(e.getKey(), i));
                 }
@@ -300,11 +298,11 @@ public final class DOMRpcRouter extends AbstractRegistration
     private static final class ActionRegistration<T extends AvailabilityListener>
         extends AbstractListenerRegistration<T> {
 
-        private Map<SchemaPath, Set<DOMDataTreeIdentifier>> prevActions;
+        private Map<Absolute, Set<DOMDataTreeIdentifier>> prevActions;
         private DOMRpcRouter router;
 
         ActionRegistration(final DOMRpcRouter router, final T listener,
-                final Map<SchemaPath, Set<DOMDataTreeIdentifier>> actions) {
+                final Map<Absolute, Set<DOMDataTreeIdentifier>> actions) {
             super(listener);
             this.router = requireNonNull(router);
             this.prevActions = requireNonNull(actions);
@@ -318,7 +316,7 @@ public final class DOMRpcRouter extends AbstractRegistration
 
         void initialTable() {
             final Collection<DOMActionInstance> added = new ArrayList<>();
-            for (Entry<SchemaPath, Set<DOMDataTreeIdentifier>> e : prevActions.entrySet()) {
+            for (Entry<Absolute, Set<DOMDataTreeIdentifier>> e : prevActions.entrySet()) {
                 added.addAll(Collections2.transform(e.getValue(), i -> DOMActionInstance.of(e.getKey(), i)));
             }
             if (!added.isEmpty()) {
@@ -332,22 +330,21 @@ public final class DOMRpcRouter extends AbstractRegistration
                 return;
             }
 
-            final Map<SchemaPath, Set<DOMDataTreeIdentifier>> actions = verifyNotNull(newTable.getOperations(l));
-            final MapDifference<SchemaPath, Set<DOMDataTreeIdentifier>> diff = Maps.difference(prevActions, actions);
+            final Map<Absolute, Set<DOMDataTreeIdentifier>> actions = verifyNotNull(newTable.getOperations(l));
+            final MapDifference<Absolute, Set<DOMDataTreeIdentifier>> diff = Maps.difference(prevActions, actions);
 
             final Set<DOMActionInstance> removed = new HashSet<>();
             final Set<DOMActionInstance> added = new HashSet<>();
 
-            for (Entry<SchemaPath, Set<DOMDataTreeIdentifier>> e : diff.entriesOnlyOnLeft().entrySet()) {
+            for (Entry<Absolute, Set<DOMDataTreeIdentifier>> e : diff.entriesOnlyOnLeft().entrySet()) {
                 removed.addAll(Collections2.transform(e.getValue(), i -> DOMActionInstance.of(e.getKey(), i)));
             }
 
-            for (Entry<SchemaPath, Set<DOMDataTreeIdentifier>> e : diff.entriesOnlyOnRight().entrySet()) {
+            for (Entry<Absolute, Set<DOMDataTreeIdentifier>> e : diff.entriesOnlyOnRight().entrySet()) {
                 added.addAll(Collections2.transform(e.getValue(), i -> DOMActionInstance.of(e.getKey(), i)));
             }
 
-            for (Entry<SchemaPath, ValueDifference<Set<DOMDataTreeIdentifier>>> e :
-                diff.entriesDiffering().entrySet()) {
+            for (Entry<Absolute, ValueDifference<Set<DOMDataTreeIdentifier>>> e : diff.entriesDiffering().entrySet()) {
                 for (DOMDataTreeIdentifier i : Sets.difference(e.getValue().leftValue(), e.getValue().rightValue())) {
                     removed.add(DOMActionInstance.of(e.getKey(), i));
                 }
@@ -393,7 +390,7 @@ public final class DOMRpcRouter extends AbstractRegistration
         }
 
         @Override
-        public ListenableFuture<? extends DOMActionResult> invokeAction(final SchemaPath type,
+        public ListenableFuture<? extends DOMActionResult> invokeAction(final Absolute type,
                 final DOMDataTreeIdentifier path, final ContainerNode input) {
             final DOMActionRoutingTableEntry entry = (DOMActionRoutingTableEntry) actionRoutingTable.getEntry(type);
             if (entry == null) {
@@ -435,8 +432,7 @@ public final class DOMRpcRouter extends AbstractRegistration
 
     private final class RpcServiceFacade implements DOMRpcService {
         @Override
-        public ListenableFuture<? extends DOMRpcResult> invokeRpc(final SchemaPath type,
-                final NormalizedNode<?, ?> input) {
+        public ListenableFuture<? extends DOMRpcResult> invokeRpc(final QName type, final NormalizedNode<?, ?> input) {
             final AbstractDOMRpcRoutingTableEntry entry = (AbstractDOMRpcRoutingTableEntry) routingTable.getEntry(type);
             if (entry == null) {
                 return Futures.immediateFailedFuture(
@@ -494,7 +490,7 @@ public final class DOMRpcRouter extends AbstractRegistration
         private static final Logger LOG = LoggerFactory.getLogger(OperationInvocation.class);
 
         static ListenableFuture<? extends DOMActionResult> invoke(final DOMActionRoutingTableEntry entry,
-                final SchemaPath type, final DOMDataTreeIdentifier path, final ContainerNode input) {
+                final Absolute type, final DOMDataTreeIdentifier path, final ContainerNode input) {
             return entry.getImplementations(path).get(0).invokeAction(type, path, input);
         }
 
@@ -502,8 +498,7 @@ public final class DOMRpcRouter extends AbstractRegistration
                 final NormalizedNode<?, ?> input) {
             if (entry instanceof UnknownDOMRpcRoutingTableEntry) {
                 return Futures.immediateFailedFuture(
-                    new DOMRpcImplementationNotAvailableException("SchemaPath %s is not resolved to an RPC",
-                        entry.getType()));
+                    new DOMRpcImplementationNotAvailableException("%s is not resolved to an RPC", entry.getType()));
             } else if (entry instanceof RoutedDOMRpcRoutingTableEntry) {
                 return invokeRoutedRpc((RoutedDOMRpcRoutingTableEntry) entry, input);
             } else if (entry instanceof GlobalDOMRpcRoutingTableEntry) {
index 82249d6266fa551685660bc4cec9cc7c6e50e72b..62903f20edcfedce5b033f71b15a265b27f68d7c 100644 (file)
@@ -23,13 +23,12 @@ 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.SchemaPath;
 
 final class DOMRpcRoutingTable extends AbstractDOMRoutingTable<DOMRpcIdentifier, YangInstanceIdentifier,
-        DOMRpcImplementation, DOMRpcAvailabilityListener, AbstractDOMRpcRoutingTableEntry> {
+        DOMRpcImplementation, DOMRpcAvailabilityListener, QName, AbstractDOMRpcRoutingTableEntry> {
     static final DOMRpcRoutingTable EMPTY = new DOMRpcRoutingTable(ImmutableMap.of(), null);
 
-    private DOMRpcRoutingTable(final Map<SchemaPath, AbstractDOMRpcRoutingTableEntry> rpcs,
+    private DOMRpcRoutingTable(final Map<QName, AbstractDOMRpcRoutingTableEntry> rpcs,
             final EffectiveModelContext schemaContext) {
         super(rpcs, schemaContext);
     }
@@ -40,15 +39,14 @@ final class DOMRpcRoutingTable extends AbstractDOMRoutingTable<DOMRpcIdentifier,
     }
 
     @Override
-    protected DOMRpcRoutingTable newInstance(final Map<SchemaPath, AbstractDOMRpcRoutingTableEntry> operations,
+    protected DOMRpcRoutingTable newInstance(final Map<QName, AbstractDOMRpcRoutingTableEntry> operations,
             final EffectiveModelContext schemaContext) {
         return new DOMRpcRoutingTable(operations, schemaContext);
     }
 
     @Override
-    protected ListMultimap<SchemaPath, YangInstanceIdentifier> decomposeIdentifiers(
-            final Set<DOMRpcIdentifier> rpcs) {
-        final ListMultimap<SchemaPath, YangInstanceIdentifier> ret = LinkedListMultimap.create();
+    protected ListMultimap<QName, YangInstanceIdentifier> decomposeIdentifiers(final Set<DOMRpcIdentifier> rpcs) {
+        final ListMultimap<QName, YangInstanceIdentifier> ret = LinkedListMultimap.create();
         for (DOMRpcIdentifier i : rpcs) {
             ret.put(i.getType(), i.getContextReference());
         }
@@ -56,7 +54,7 @@ final class DOMRpcRoutingTable extends AbstractDOMRoutingTable<DOMRpcIdentifier,
     }
 
     @Override
-    AbstractDOMRpcRoutingTableEntry createOperationEntry(final EffectiveModelContext context, final SchemaPath key,
+    AbstractDOMRpcRoutingTableEntry createOperationEntry(final EffectiveModelContext context, final QName key,
             final Map<YangInstanceIdentifier, List<DOMRpcImplementation>> implementations) {
         final RpcDefinition rpcDef = findRpcDefinition(context, key);
         if (rpcDef == null) {
@@ -72,9 +70,8 @@ final class DOMRpcRoutingTable extends AbstractDOMRoutingTable<DOMRpcIdentifier,
         return new GlobalDOMRpcRoutingTableEntry(rpcDef, implementations);
     }
 
-    private static RpcDefinition findRpcDefinition(final SchemaContext context, final SchemaPath schemaPath) {
+    private static RpcDefinition findRpcDefinition(final SchemaContext context, final QName qname) {
         if (context != null) {
-            final QName qname = schemaPath.getPathFromRoot().iterator().next();
             final Module module = context.findModule(qname.getModule()).orElse(null);
             if (module != null && module.getRpcs() != null) {
                 for (RpcDefinition rpc : module.getRpcs()) {
index a2d27014e5cc4310fa97a85d81f1dfbdd25e569e..f7c9fe3d40c2a62475bb7222ef1d53f61b3564e6 100644 (file)
@@ -15,9 +15,8 @@ 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, final Map<YangInstanceIdentifier,
-            List<DOMRpcImplementation>> impls) {
+    private GlobalDOMRpcRoutingTableEntry(final DOMRpcIdentifier rpcId,
+            final Map<YangInstanceIdentifier, List<DOMRpcImplementation>> impls) {
         super(rpcId, impls);
     }
 
@@ -25,7 +24,7 @@ final class GlobalDOMRpcRoutingTableEntry extends AbstractDOMRpcRoutingTableEntr
     // forward something we don't know to be an RPC.
     GlobalDOMRpcRoutingTableEntry(final RpcDefinition def, final Map<YangInstanceIdentifier,
             List<DOMRpcImplementation>> impls) {
-        super(DOMRpcIdentifier.create(def.getPath()), impls);
+        super(DOMRpcIdentifier.create(def.getQName()), impls);
     }
 
     @Override
index 4adc9e01631c6ae14d3352119aec7d4e808bb024..da60ca811dccf94cc6746270fefe447270058148 100644 (file)
@@ -17,7 +17,7 @@ import org.opendaylight.mdsal.dom.api.DOMNotificationService;
 import org.opendaylight.mdsal.dom.spi.DOMNotificationSubscriptionListener;
 import org.opendaylight.mdsal.dom.spi.DOMNotificationSubscriptionListenerRegistry;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
@@ -87,7 +87,7 @@ public final class OSGiDOMNotificationRouter implements DOMNotificationService,
 
     @Override
     public <T extends DOMNotificationListener> ListenerRegistration<T> registerNotificationListener(final T listener,
-            final Collection<SchemaPath> types) {
+            final Collection<Absolute> types) {
         return router.registerNotificationListener(listener, types);
     }
 }
index 6079b724fb21a2863e271e102ff4bdd4f2e56d30..bfea5534ac592bb254ba8786d010384531e93fc6 100644 (file)
@@ -15,7 +15,6 @@ 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,
             final Map<YangInstanceIdentifier, List<DOMRpcImplementation>> impls) {
         super(routedRpcId, impls);
@@ -23,7 +22,7 @@ final class RoutedDOMRpcRoutingTableEntry extends AbstractDOMRpcRoutingTableEntr
 
     RoutedDOMRpcRoutingTableEntry(final RpcDefinition def, final YangInstanceIdentifier keyId,
             final Map<YangInstanceIdentifier, List<DOMRpcImplementation>> impls) {
-        super(DOMRpcIdentifier.create(def.getPath(), keyId), impls);
+        super(DOMRpcIdentifier.create(def.getQName(), keyId), impls);
     }
 
     @Override
index eb172df890f3b5f08bd18b44e5c6d0a53c2ace82..df442df292a5d93e892cbcab487ab04d24370bab 100644 (file)
@@ -11,18 +11,18 @@ import java.util.List;
 import java.util.Map;
 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.SchemaPath;
 
 final class UnknownDOMRpcRoutingTableEntry extends AbstractDOMRpcRoutingTableEntry {
-    UnknownDOMRpcRoutingTableEntry(final SchemaPath schemaPath, final Map<YangInstanceIdentifier,
-            List<DOMRpcImplementation>> impls) {
-        super(DOMRpcIdentifier.create(schemaPath), impls);
+    UnknownDOMRpcRoutingTableEntry(final QName type,
+            final Map<YangInstanceIdentifier, List<DOMRpcImplementation>> impls) {
+        super(DOMRpcIdentifier.create(type), impls);
     }
 
     @Override
-    protected UnknownDOMRpcRoutingTableEntry newInstance(final Map<YangInstanceIdentifier,
-            List<DOMRpcImplementation>> impls) {
+    protected UnknownDOMRpcRoutingTableEntry newInstance(
+            final Map<YangInstanceIdentifier, List<DOMRpcImplementation>> impls) {
         return new UnknownDOMRpcRoutingTableEntry(getType(), impls);
     }
 }
index 12a728ba26b055036e7b096ced0ed8b47554bf83..2781a72e7f424ef4389180a47fd0b71e9cf7d9cd 100644 (file)
@@ -30,10 +30,11 @@ import org.junit.Test;
 import org.opendaylight.mdsal.dom.api.DOMNotification;
 import org.opendaylight.mdsal.dom.api.DOMNotificationListener;
 import org.opendaylight.mdsal.dom.api.DOMNotificationPublishService;
+import org.opendaylight.mdsal.dom.broker.util.TestModel;
 import org.opendaylight.mdsal.dom.spi.DOMNotificationSubscriptionListener;
 import org.opendaylight.yangtools.concepts.AbstractListenerRegistration;
 import org.opendaylight.yangtools.util.ListenerRegistry;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 public class DOMNotificationRouterTest extends TestUtils {
 
@@ -55,11 +56,13 @@ public class DOMNotificationRouterTest extends TestUtils {
         final DOMNotificationListener domNotificationListener = new TestListener(latch);
         final DOMNotificationRouter domNotificationRouter = DOMNotificationRouter.create(1);
 
-        Multimap<SchemaPath, ?> listeners = domNotificationRouter.listeners();
+        Multimap<Absolute, ?> listeners = domNotificationRouter.listeners();
 
         assertTrue(listeners.isEmpty());
-        assertNotNull(domNotificationRouter.registerNotificationListener(domNotificationListener, SchemaPath.ROOT));
-        assertNotNull(domNotificationRouter.registerNotificationListener(domNotificationListener, SchemaPath.SAME));
+        assertNotNull(domNotificationRouter.registerNotificationListener(domNotificationListener,
+            Absolute.of(TestModel.TEST_QNAME)));
+        assertNotNull(domNotificationRouter.registerNotificationListener(domNotificationListener,
+            Absolute.of(TestModel.TEST2_QNAME)));
 
         listeners = domNotificationRouter.listeners();
 
@@ -77,7 +80,7 @@ public class DOMNotificationRouterTest extends TestUtils {
 
         final DOMNotification domNotification = mock(DOMNotification.class);
         doReturn("test").when(domNotification).toString();
-        doReturn(SchemaPath.ROOT).when(domNotification).getType();
+        doReturn(Absolute.of(TestModel.TEST_QNAME)).when(domNotification).getType();
         doReturn(TEST_CHILD).when(domNotification).getBody();
 
         assertNotNull(domNotificationRouter.offerNotification(domNotification));
@@ -86,6 +89,7 @@ public class DOMNotificationRouterTest extends TestUtils {
             assertNotNull(domNotificationRouter.offerNotification(domNotification, 1, TimeUnit.SECONDS));
             assertNotNull(domNotificationRouter.offerNotification(domNotification, 1, TimeUnit.SECONDS));
         } catch (Exception e) {
+            // FIXME: what is the point here?!
             assertTrue(e instanceof UnsupportedOperationException);
         }
 
@@ -96,7 +100,7 @@ public class DOMNotificationRouterTest extends TestUtils {
     public void offerNotification() throws Exception {
         final DOMNotificationRouter domNotificationRouter = DOMNotificationRouter.create(1);
         final DOMNotification domNotification = mock(DOMNotification.class);
-        doReturn(SchemaPath.ROOT).when(domNotification).getType();
+        doReturn(Absolute.of(TestModel.TEST_QNAME)).when(domNotification).getType();
         doReturn(TEST_CHILD).when(domNotification).getBody();
         assertNotNull(domNotificationRouter.putNotification(domNotification));
         assertNotNull(domNotificationRouter.offerNotification(domNotification));
@@ -109,12 +113,12 @@ public class DOMNotificationRouterTest extends TestUtils {
         final TestListener testListener = new TestListener(latch);
         final DOMNotification domNotification = mock(DOMNotification.class);
         doReturn("test").when(domNotification).toString();
-        doReturn(SchemaPath.ROOT).when(domNotification).getType();
+        doReturn(Absolute.of(TestModel.TEST_QNAME)).when(domNotification).getType();
         doReturn(TEST_CHILD).when(domNotification).getBody();
 
         try (TestRouter testRouter = new TestRouter(1)) {
-            assertNotNull(testRouter.registerNotificationListener(testListener, SchemaPath.ROOT));
-            assertNotNull(testRouter.registerNotificationListener(testListener, SchemaPath.SAME));
+            assertNotNull(testRouter.registerNotificationListener(testListener, Absolute.of(TestModel.TEST_QNAME)));
+            assertNotNull(testRouter.registerNotificationListener(testListener, Absolute.of(TestModel.TEST2_QNAME)));
 
             assertNotEquals(DOMNotificationPublishService.REJECTED,
                 testRouter.offerNotification(domNotification, 3, TimeUnit.SECONDS));
index f35adf97eddf2d878eb8a4405f28dea97f50b40d..9c13dbf84e10650ef9a1cf2838199f1c4a918f1f 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.mdsal.dom.broker;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 
@@ -18,8 +19,8 @@ import java.util.concurrent.RejectedExecutionException;
 import org.junit.Test;
 import org.opendaylight.mdsal.dom.api.DOMRpcAvailabilityListener;
 import org.opendaylight.mdsal.dom.api.DOMRpcIdentifier;
+import org.opendaylight.mdsal.dom.api.DOMRpcProviderService;
 import org.opendaylight.mdsal.dom.broker.util.TestModel;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 public class DOMRpcRouterTest extends TestUtils {
 
@@ -27,24 +28,24 @@ public class DOMRpcRouterTest extends TestUtils {
     public void registerRpcImplementation() {
         try (DOMRpcRouter rpcRouter = new DOMRpcRouter()) {
             DOMRpcRoutingTable routingTable = rpcRouter.routingTable();
-            assertFalse(routingTable.getOperations().containsKey(SchemaPath.ROOT));
+            assertFalse(routingTable.getOperations().containsKey(TestModel.TEST_QNAME));
 
             rpcRouter.getRpcProviderService().registerRpcImplementation(getTestRpcImplementation(),
-                DOMRpcIdentifier.create(SchemaPath.ROOT, null));
+                DOMRpcIdentifier.create(TestModel.TEST_QNAME, null));
             routingTable = rpcRouter.routingTable();
-            assertTrue(routingTable.getOperations().containsKey(SchemaPath.ROOT));
+            assertTrue(routingTable.getOperations().containsKey(TestModel.TEST_QNAME));
 
             rpcRouter.getRpcProviderService().registerRpcImplementation(getTestRpcImplementation(),
-                DOMRpcIdentifier.create(SchemaPath.SAME, null));
+                DOMRpcIdentifier.create(TestModel.TEST2_QNAME, null));
             routingTable = rpcRouter.routingTable();
-            assertTrue(routingTable.getOperations().containsKey(SchemaPath.SAME));
+            assertTrue(routingTable.getOperations().containsKey(TestModel.TEST2_QNAME));
         }
     }
 
     @Test
     public void invokeRpc() {
         try (DOMRpcRouter rpcRouter = new DOMRpcRouter()) {
-            assertNotNull(rpcRouter.getRpcService().invokeRpc(SchemaPath.create(false, TestModel.TEST_QNAME), null));
+            assertNotNull(rpcRouter.getRpcService().invokeRpc(TestModel.TEST_QNAME, null));
         }
     }
 
@@ -77,11 +78,13 @@ public class DOMRpcRouterTest extends TestUtils {
         }
     }
 
-    @Test(expected = RejectedExecutionException.class)
+    @Test
     public void close() {
         final DOMRpcRouter rpcRouter = new DOMRpcRouter();
         rpcRouter.close();
-        rpcRouter.getRpcProviderService().registerRpcImplementation(getTestRpcImplementation(),
-            DOMRpcIdentifier.create(SchemaPath.ROOT, null));
+
+        final DOMRpcProviderService svc = rpcRouter.getRpcProviderService();
+        assertThrows(RejectedExecutionException.class, () -> svc.registerRpcImplementation(getTestRpcImplementation(),
+            DOMRpcIdentifier.create(TestModel.TEST_QNAME, null)));
     }
 }
index 9014555f01c9749cb6bef1bac8348d386a9f6675..1dfcb8eb1dcf25bcb09d93d9fc8283f213e8a0df 100644 (file)
@@ -7,55 +7,57 @@
  */
 package org.opendaylight.mdsal.dom.broker;
 
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThrows;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 
+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 java.util.concurrent.TimeoutException;
 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.mdsal.dom.broker.util.TestModel;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 public class GlobalDOMRpcRoutingTableEntryTest extends TestUtils {
-
     @Test
-    public void basicTest() throws InterruptedException, TimeoutException {
+    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(SchemaPath.ROOT).when(rpcDefinition).getPath();
+        doReturn(TestModel.TEST2_QNAME).when(rpcDefinition).getQName();
         final GlobalDOMRpcRoutingTableEntry globalDOMRpcRoutingTableEntry = new GlobalDOMRpcRoutingTableEntry(
                 rpcDefinition, new HashMap<>());
         rpcImplementation.add(getTestRpcImplementation());
         rpcImplementations.put(yangInstanceIdentifier, rpcImplementation);
 
-        assertTrue(globalDOMRpcRoutingTableEntry.getType().equals(SchemaPath.ROOT));
+        assertEquals(TestModel.TEST2_QNAME, globalDOMRpcRoutingTableEntry.getType());
         assertTrue(globalDOMRpcRoutingTableEntry.getImplementations().isEmpty());
         assertFalse(globalDOMRpcRoutingTableEntry.newInstance(rpcImplementations).getImplementations().isEmpty());
         assertTrue(globalDOMRpcRoutingTableEntry.newInstance(rpcImplementations).getImplementations().containsValue(
                 rpcImplementation));
 
-        try {
-            OperationInvocation.invoke(globalDOMRpcRoutingTableEntry.newInstance(rpcImplementations),
-                    TEST_CONTAINER).get(5, TimeUnit.SECONDS);
-            fail("Expected DOMRpcImplementationNotAvailableException");
-        } catch (ExecutionException e) {
-            assertTrue(e.getCause() instanceof DOMRpcImplementationNotAvailableException);
-            assertTrue(e.getCause().getMessage().contains(EXCEPTION_TEXT));
-        }
+        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();
+        assertThat(cause, instanceOf(DOMRpcImplementationNotAvailableException.class));
+        assertThat(cause.getMessage(), containsString(EXCEPTION_TEXT));
     }
 }
index b8ae49ea0d70b471df7be006b259f6018dfa2c20..256487fcd1f4e6e4e42f6724a79bd1a1c3fc6e6d 100644 (file)
@@ -7,39 +7,35 @@
  */
 package org.opendaylight.mdsal.dom.broker;
 
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.Assert.assertThrows;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 
+import com.google.common.util.concurrent.ListenableFuture;
 import java.util.HashMap;
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeoutException;
+import java.util.concurrent.TimeUnit;
 import org.junit.Test;
 import org.opendaylight.mdsal.dom.api.DOMRpcImplementationNotAvailableException;
 import org.opendaylight.mdsal.dom.broker.DOMRpcRouter.OperationInvocation;
 import org.opendaylight.mdsal.dom.broker.util.TestModel;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 public class RoutedDOMRpcRoutingTableEntryTest extends TestUtils {
-
-    @SuppressWarnings("checkstyle:IllegalCatch")
     @Test
-    public void basicTest() throws InterruptedException, TimeoutException {
+    public void basicTest()  {
         final RpcDefinition rpcDefinition = mock(RpcDefinition.class);
-        doReturn(SchemaPath.ROOT).when(rpcDefinition).getPath();
+        doReturn(TestModel.TEST2_QNAME).when(rpcDefinition).getQName();
 
         final RoutedDOMRpcRoutingTableEntry routedDOMRpcRoutingTableEntry =
                 new RoutedDOMRpcRoutingTableEntry(rpcDefinition, TestModel.TEST_PATH, new HashMap<>());
         assertNotNull(routedDOMRpcRoutingTableEntry.newInstance(new HashMap<>()));
 
-        try {
-            OperationInvocation.invoke(routedDOMRpcRoutingTableEntry, TEST_CHILD).get();
-            fail("Expected DOMRpcImplementationNotAvailableException");
-        } catch (ExecutionException e) {
-            assertTrue(e.getCause() instanceof DOMRpcImplementationNotAvailableException);
-        }
+        final ListenableFuture<?> future = OperationInvocation.invoke(routedDOMRpcRoutingTableEntry, TEST_CHILD);
+        final ExecutionException ex = assertThrows(ExecutionException.class, () -> future.get(5, TimeUnit.SECONDS));
+        assertThat(ex.getCause(), instanceOf(DOMRpcImplementationNotAvailableException.class));
     }
 }
index 5c334fe2d1de49996b76548eb67c9456d89d9ecf..ce66a5cdd39f5ea9482e1a9490f62610fa5f5c1d 100644 (file)
@@ -20,7 +20,6 @@ import org.opendaylight.mdsal.dom.api.DOMRpcImplementation;
 import org.opendaylight.mdsal.dom.broker.DOMRpcRouter.OperationInvocation;
 import org.opendaylight.mdsal.dom.broker.util.TestModel;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 public class UnknownDOMRpcRoutingTableEntryTest extends TestUtils {
     private static final List<DOMRpcImplementation> TEST_LIST = new ArrayList<>();
@@ -31,7 +30,8 @@ public class UnknownDOMRpcRoutingTableEntryTest extends TestUtils {
         final List<YangInstanceIdentifier> addList1 = new ArrayList<>();
         final List<YangInstanceIdentifier> addList2 = new ArrayList<>();
         final DOMRpcImplementation testClass = getTestRpcImplementation();
-        final UnknownDOMRpcRoutingTableEntry test = new UnknownDOMRpcRoutingTableEntry(SchemaPath.ROOT, emptyImpls);
+        final UnknownDOMRpcRoutingTableEntry test =
+                new UnknownDOMRpcRoutingTableEntry(TestModel.TEST_QNAME, emptyImpls);
 
         TEST_LIST.add(testClass);
         emptyImpls.put(YangInstanceIdentifier.empty(), TEST_LIST);
index 2e3593ff086d2c76584b7d5aad41a7b9412a3cb7..ee919cb79d6679e2086fde2eacfeb449e40b999b 100644 (file)
@@ -10,20 +10,18 @@ package org.opendaylight.mdsal.dom.spi;
 import com.google.common.annotations.Beta;
 import java.util.EventListener;
 import java.util.Set;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 /**
- * Listener which is notified when subscriptions changes and
- * provides set of notification types for which currently
+ * Listener which is notified when subscriptions changes and provides set of notification types for which currently
  * subscriptions are in place.
  */
 @Beta
 public interface DOMNotificationSubscriptionListener extends EventListener {
-
     /**
      * Invoked when notification subscription changed.
      *
      * @param currentTypes Set of notification types for which listeners are registered.
      */
-    void onSubscriptionChanged(Set<SchemaPath> currentTypes);
+    void onSubscriptionChanged(Set<Absolute> currentTypes);
 }
index dc096eacfa227eba258f9260054a46776061a13b..05136bb9696a41dcb3e271a042e67c453ca3608d 100644 (file)
@@ -17,7 +17,7 @@ import org.opendaylight.mdsal.dom.api.DOMActionService;
 import org.opendaylight.mdsal.dom.api.DOMActionServiceExtension;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 @Beta
 public abstract class ForwardingDOMActionService extends ForwardingObject implements DOMActionService {
@@ -27,7 +27,7 @@ public abstract class ForwardingDOMActionService extends ForwardingObject implem
     }
 
     @Override
-    public ListenableFuture<? extends DOMActionResult> invokeAction(final SchemaPath type,
+    public ListenableFuture<? extends DOMActionResult> invokeAction(final Absolute type,
             final DOMDataTreeIdentifier path, final ContainerNode input) {
         return delegate().invokeAction(type, path, input);
     }
index 2e0f6e33525b92bcdd12fe2bbdcff43c1d3311e8..079cb186cc04128d4aa46e1b6305eeb95a3b7df8 100644 (file)
@@ -12,7 +12,7 @@ import java.util.Collection;
 import org.opendaylight.mdsal.dom.api.DOMNotificationListener;
 import org.opendaylight.mdsal.dom.api.DOMNotificationService;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 
 /**
  * Utility implementation of a {@link DOMNotificationService} which forwards all requests
@@ -24,13 +24,13 @@ public abstract class ForwardingDOMNotificationService extends ForwardingObject
 
     @Override
     public <T extends DOMNotificationListener> ListenerRegistration<T> registerNotificationListener(final T listener,
-            final Collection<SchemaPath> types) {
+            final Collection<Absolute> types) {
         return delegate().registerNotificationListener(listener, types);
     }
 
     @Override
     public <T extends DOMNotificationListener> ListenerRegistration<T> registerNotificationListener(final T listener,
-            final SchemaPath... types) {
+            final Absolute... types) {
         return delegate().registerNotificationListener(listener, types);
     }
 }
index e1f51292eeebc0301334216f8c331df0e0dc6651..c2f3e53995d352bbe27fdd8a7045be47419aef54 100644 (file)
@@ -14,8 +14,8 @@ import org.opendaylight.mdsal.dom.api.DOMRpcAvailabilityListener;
 import org.opendaylight.mdsal.dom.api.DOMRpcResult;
 import org.opendaylight.mdsal.dom.api.DOMRpcService;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 
 /**
  * Utility {@link DOMRpcService} which forwards all requests to a backing delegate instance.
@@ -25,7 +25,7 @@ public abstract class ForwardingDOMRpcService extends ForwardingObject implement
     protected abstract @NonNull DOMRpcService delegate();
 
     @Override
-    public ListenableFuture<? extends DOMRpcResult> invokeRpc(final SchemaPath type, final NormalizedNode<?, ?> input) {
+    public ListenableFuture<? extends DOMRpcResult> invokeRpc(final QName type, final NormalizedNode<?, ?> input) {
         return delegate().invokeRpc(type, input);
     }
 
index cc58aaf116dfbc9ea78858b6c76ab4e320f63e82..56dfacb0564a41bcc408a61f1076c72c0359126d 100644 (file)
@@ -10,28 +10,28 @@ package org.opendaylight.mdsal.dom.spi;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
-import static org.mockito.MockitoAnnotations.initMocks;
 
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
 import org.opendaylight.mdsal.dom.api.DOMRpcAvailabilityListener;
 import org.opendaylight.mdsal.dom.api.DOMRpcService;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.common.QName;
 
+@RunWith(MockitoJUnitRunner.StrictStubs.class)
 public class ForwardingDOMRpcServiceTest extends ForwardingDOMRpcService {
-
     @Mock(name = "domRpcService")
     private DOMRpcService domRpcService;
 
     @Test
     public void basicTest() throws Exception {
-        initMocks(this);
-
         final DOMRpcAvailabilityListener domRpcAvailabilityListener = mock(DOMRpcAvailabilityListener.class);
+        final QName id = QName.create("urn:foo", "foo");
 
-        doReturn(null).when(domRpcService).invokeRpc(SchemaPath.SAME, null);
-        this.invokeRpc(SchemaPath.SAME, null);
-        verify(domRpcService).invokeRpc(SchemaPath.SAME, null);
+        doReturn(null).when(domRpcService).invokeRpc(id, null);
+        this.invokeRpc(id, null);
+        verify(domRpcService).invokeRpc(id, null);
 
         doReturn(null).when(domRpcService).registerRpcListener(domRpcAvailabilityListener);
         this.registerRpcListener(domRpcAvailabilityListener);