Fixed issue when Notification didn't pass from Netconf client to registered and configured ODL plugin application. After Fix, when notification is send to ODL,
notification is forwarded through md-sal directly into application that is registered for listening on mount point where notification arrive.
Change-Id: I4e0c644efb72ba0c26c75e9bd7452afbb0f4897c
Signed-off-by: Lukas Sedlak <lsedlak@cisco.com>
Signed-off-by: Ed Warnicke <eaw@cisco.com>
Signed-off-by: Tony Tkacik <ttkacik@cisco.com>
*/
package org.opendaylight.controller.sal.binding.api;
+import java.util.EventListener;
import java.util.concurrent.ExecutorService;
import org.opendaylight.controller.md.sal.common.api.notify.NotificationPublishService;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.concepts.Registration;
import org.opendaylight.yangtools.yang.binding.Notification;
public interface NotificationProviderService extends NotificationService, NotificationPublishService<Notification> {
+
/**
* Deprecated. Use {@link #publish(Notification)}.
*
/**
* Publishes a notification.
*
- * @param Notification notification to publish.
+ * @param Notification
+ * notification to publish.
*
*/
@Override
*/
@Override
void publish(Notification notification, ExecutorService service);
+
+ ListenerRegistration<NotificationInterestListener> registerInterestListener(
+ NotificationInterestListener interestListener);
+
+ public interface NotificationInterestListener extends EventListener {
+
+ void onNotificationSubscribtion(Class<? extends Notification> notificationType);
+ }
}
import org.opendaylight.yangtools.concepts.Registration\r
import org.opendaylight.yangtools.yang.binding.Notification\r
import org.slf4j.LoggerFactory\r
-import org.opendaylight.controller.sal.binding.codegen.impl.SingletonHolder\rimport com.google.common.collect.Multimaps
-
-class NotificationBrokerImpl implements NotificationProviderService, AutoCloseable {\r
+import org.opendaylight.controller.sal.binding.codegen.impl.SingletonHolder\rimport com.google.common.collect.Multimaps\r
+import org.opendaylight.yangtools.concepts.util.ListenerRegistry\r
+import org.opendaylight.controller.sal.binding.api.NotificationProviderService.NotificationInterestListener\r
\r
+class NotificationBrokerImpl implements NotificationProviderService, AutoCloseable {\r
+ \r
+ val ListenerRegistry<NotificationInterestListener> interestListeners = ListenerRegistry.create;\r
+ \r
val Multimap<Class<? extends Notification>, NotificationListener<?>> listeners;\r
\r
@Property\r
var ExecutorService executor;\r
+ \r
+ val logger = LoggerFactory.getLogger(NotificationBrokerImpl)\r
\r
new() {\r
listeners = Multimaps.synchronizedSetMultimap(HashMultimap.create())\r
NotificationListener<T> listener) {\r
val reg = new GenericNotificationRegistration<T>(notificationType, listener, this);\r
listeners.put(notificationType, listener);\r
+ announceNotificationSubscription(notificationType);\r
return reg;\r
}\r
+ \r
+ def announceNotificationSubscription(Class<? extends Notification> notification) {\r
+ for (listener : interestListeners) {\r
+ try {\r
+ listener.instance.onNotificationSubscribtion(notification);\r
+ } catch (Exception e) {\r
+ logger.error("", e.message)\r
+ }\r
+ }\r
+ }\r
\r
override registerNotificationListener(\r
org.opendaylight.yangtools.yang.binding.NotificationListener listener) {\r
val invoker = SingletonHolder.INVOKER_FACTORY.invokerFor(listener);\r
for (notifyType : invoker.supportedNotifications) {\r
listeners.put(notifyType, invoker.invocationProxy)\r
+ announceNotificationSubscription(notifyType)\r
}\r
val registration = new GeneratedListenerRegistration(listener, invoker,this);\r
return registration as Registration<org.opendaylight.yangtools.yang.binding.NotificationListener>;\r
//FIXME: implement properly.\r
}\r
\r
+ override registerInterestListener(NotificationInterestListener interestListener) {\r
+ val registration = interestListeners.register(interestListener);\r
+ \r
+ for(notification : listeners.keySet) {\r
+ interestListener.onNotificationSubscribtion(notification);\r
+ }\r
+ return registration\r
+ }\r
}\r
\r
class GenericNotificationRegistration<T extends Notification> extends AbstractObjectRegistration<NotificationListener<T>> implements ListenerRegistration<NotificationListener<T>> {\r
connector.startDataForwarding();
}
- public static void startNotificationForwarding(BindingIndependentConnector connector, NotificationProviderService baService, NotificationPublishService domService) {
+ public static void startNotificationForwarding(BindingIndependentConnector connector,
+ NotificationProviderService baService, NotificationPublishService domService) {
if(connector.isNotificationForwarding()) {
return;
}
-
- // FIXME
+ connector.setBindingNotificationService(baService);
+ connector.setDomNotificationService(domService);
+ connector.startNotificationForwarding();
}
//
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import org.opendaylight.controller.md.sal.common.api.routing.RouteChange;
import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener;
import org.opendaylight.controller.md.sal.common.api.routing.RouteChangePublisher;
+import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
+import org.opendaylight.controller.sal.binding.api.NotificationProviderService.NotificationInterestListener;
import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
import org.opendaylight.controller.sal.binding.api.data.RuntimeDataProvider;
import org.opendaylight.controller.sal.core.api.RpcImplementation;
import org.opendaylight.controller.sal.core.api.RpcProvisionRegistry;
import org.opendaylight.controller.sal.core.api.data.DataModificationTransaction;
+import org.opendaylight.controller.sal.core.api.notify.NotificationListener;
+import org.opendaylight.controller.sal.core.api.notify.NotificationPublishService;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.concepts.Registration;
import org.opendaylight.yangtools.concepts.util.ClassLoaderUtils;
import org.opendaylight.yangtools.yang.binding.DataContainer;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.Notification;
import org.opendaylight.yangtools.yang.binding.RpcService;
import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
import org.opendaylight.yangtools.yang.common.QName;
private final Logger LOG = LoggerFactory.getLogger(BindingIndependentConnector.class);
- @SuppressWarnings( "deprecation")
+ @SuppressWarnings("deprecation")
private static final InstanceIdentifier<? extends DataObject> ROOT = InstanceIdentifier.builder().toInstance();
private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier ROOT_BI = org.opendaylight.yangtools.yang.data.api.InstanceIdentifier
private final static Method EQUALS_METHOD;
-
private BindingIndependentMappingService mappingService;
private org.opendaylight.controller.sal.core.api.data.DataProviderService biDataService;
private org.opendaylight.controller.sal.dom.broker.spi.RpcRouter biRouter;
+ private NotificationProviderService baNotifyService;
+
+ private NotificationPublishService domNotificationService;
static {
try {
- EQUALS_METHOD = Object.class.getMethod("equals", Object.class);
+ EQUALS_METHOD = Object.class.getMethod("equals", Object.class);
} catch (Exception e) {
throw new RuntimeException(e);
}
baRpcRegistryImpl.registerRouterInstantiationListener(domToBindingRpcManager.getInstance());
baRpcRegistryImpl.registerGlobalRpcRegistrationListener(domToBindingRpcManager.getInstance());
}
- if(biRpcRegistry instanceof org.opendaylight.controller.sal.dom.broker.spi.RpcRouter) {
+ if (biRpcRegistry instanceof org.opendaylight.controller.sal.dom.broker.spi.RpcRouter) {
biRouter = (org.opendaylight.controller.sal.dom.broker.spi.RpcRouter) biRpcRegistry;
}
rpcForwarding = true;
public void startNotificationForwarding() {
checkState(!notificationForwarding, "Connector is already forwarding notifications.");
- notificationForwarding = true;
+ if (baNotifyService != null && domNotificationService != null) {
+ baNotifyService.registerInterestListener(new DomToBindingNotificationForwarder());
+
+ notificationForwarding = true;
+ }
}
protected void setMappingService(BindingIndependentMappingService mappingService) {
}
createDefaultDomForwarder();
} catch (Exception e) {
- LOG.error("Could not forward Rpcs of type {}", service.getName(),e);
+ LOG.error("Could not forward Rpcs of type {}", service.getName(), e);
}
registrations = registrationsBuilder.build();
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- if(EQUALS_METHOD.equals(method)) {
+ if (EQUALS_METHOD.equals(method)) {
return false;
}
RpcInvocationStrategy strategy = strategiesByMethod.get(method);
checkState(strategy != null);
checkArgument(args.length <= 2);
- if(args.length == 1) {
+ if (args.length == 1) {
checkArgument(args[0] instanceof DataObject);
return strategy.forwardToDomBroker((DataObject) args[0]);
}
RpcInvocationStrategy strategy = null;
if (outputClass.isPresent()) {
if (inputClass.isPresent()) {
- strategy = new DefaultInvocationStrategy(rpc,targetMethod, outputClass.get(), inputClass.get());
+ strategy = new DefaultInvocationStrategy(rpc, targetMethod, outputClass.get(), inputClass
+ .get());
} else {
- strategy = new NoInputNoOutputInvocationStrategy(rpc,targetMethod);
+ strategy = new NoInputNoOutputInvocationStrategy(rpc, targetMethod);
}
} else if(inputClass.isPresent()){
strategy = new NoOutputInvocationStrategy(rpc,targetMethod, inputClass.get());
protected final Method targetMethod;
protected final QName rpc;
- public RpcInvocationStrategy(QName rpc,Method targetMethod) {
+ public RpcInvocationStrategy(QName rpc, Method targetMethod) {
this.targetMethod = targetMethod;
this.rpc = rpc;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public DefaultInvocationStrategy(QName rpc, Method targetMethod, Class<?> outputClass,
Class<? extends DataContainer> inputClass) {
- super(rpc,targetMethod);
+ super(rpc, targetMethod);
this.outputClass = new WeakReference(outputClass);
this.inputClass = new WeakReference(inputClass);
}
+ @SuppressWarnings("unchecked")
@Override
public RpcResult<CompositeNode> uncheckedInvoke(RpcService rpcService, CompositeNode domInput) throws Exception {
DataContainer bindingInput = mappingService.dataObjectFromDataDom(inputClass.get(), domInput);
public Future<RpcResult<?>> forwardToDomBroker(DataObject input) {
if(biRouter != null) {
CompositeNode xml = mappingService.toDataDom(input);
- CompositeNode wrappedXml = ImmutableCompositeNode.create(rpc,ImmutableList.<Node<?>>of(xml));
+ CompositeNode wrappedXml = ImmutableCompositeNode.create(rpc, ImmutableList.<Node<?>> of(xml));
RpcResult<CompositeNode> result = biRouter.invokeRpc(rpc, wrappedXml);
Object baResultValue = null;
- if(result.getResult() != null) {
+ if (result.getResult() != null) {
baResultValue = mappingService.dataObjectFromDataDom(outputClass.get(), result.getResult());
}
RpcResult<?> baResult = Rpcs.getRpcResult(result.isSuccessful(), baResultValue, result.getErrors());
- return Futures.<RpcResult<?>>immediateFuture(baResult);
+ return Futures.<RpcResult<?>> immediateFuture(baResult);
}
- return Futures.<RpcResult<?>>immediateFuture(Rpcs.getRpcResult(false));
+ return Futures.<RpcResult<?>> immediateFuture(Rpcs.getRpcResult(false));
}
}
private class NoInputNoOutputInvocationStrategy extends RpcInvocationStrategy {
public NoInputNoOutputInvocationStrategy(QName rpc, Method targetMethod) {
- super(rpc,targetMethod);
+ super(rpc, targetMethod);
}
public RpcResult<CompositeNode> uncheckedInvoke(RpcService rpcService, CompositeNode domInput) throws Exception {
public BindingIndependentMappingService getMappingService() {
return mappingService;
}
+
+ public void setBindingNotificationService(NotificationProviderService baService) {
+ this.baNotifyService = baService;
+
+ }
+
+ public void setDomNotificationService(NotificationPublishService domService) {
+ this.domNotificationService = domService;
+ }
+
+ private class DomToBindingNotificationForwarder implements NotificationInterestListener, NotificationListener {
+
+ private ConcurrentMap<QName, WeakReference<Class<? extends Notification>>> notifications = new ConcurrentHashMap<>();
+ private Set<QName> supportedNotifications = new HashSet<>();
+
+ @Override
+ public Set<QName> getSupportedNotifications() {
+ return Collections.unmodifiableSet(supportedNotifications);
+ }
+
+ @Override
+ public void onNotification(CompositeNode notification) {
+ QName qname = notification.getNodeType();
+ WeakReference<Class<? extends Notification>> potential = notifications.get(qname);
+ if (potential != null) {
+ Class<? extends Notification> potentialClass = potential.get();
+ if (potentialClass != null) {
+ final DataContainer baNotification = mappingService.dataObjectFromDataDom(potentialClass,
+ notification);
+
+ if (baNotification instanceof Notification) {
+ baNotifyService.publish((Notification) baNotification);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onNotificationSubscribtion(Class<? extends Notification> notificationType) {
+ QName qname = BindingReflections.findQName(notificationType);
+ if (qname != null) {
+ WeakReference<Class<? extends Notification>> already = notifications.putIfAbsent(qname,
+ new WeakReference<Class<? extends Notification>>(notificationType));
+ if (already == null) {
+ domNotificationService.addNotificationListener(qname, this);
+ supportedNotifications.add(qname);
+ }
+ }
+ }
+ }
}
+++ /dev/null
-/*
- * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.controller.sal.binding.impl.connect.dom;
-
-import java.util.concurrent.ConcurrentMap;
-
-import org.opendaylight.controller.sal.binding.api.mount.MountProviderInstance;
-import org.opendaylight.controller.sal.binding.api.mount.MountProviderService;
-import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMappingService;
-import org.opendaylight.yangtools.yang.data.impl.codec.DeserializationException;
-import org.opendaylight.controller.sal.core.api.mount.MountProvisionInstance;
-import org.opendaylight.controller.sal.core.api.mount.MountProvisionService;
-import org.opendaylight.controller.sal.core.api.mount.MountProvisionService.MountProvisionListener;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-
-public class BindingIndependentMountPointForwarder {
-
- private MountProvisionService domMountService;
- private MountProviderService baMountService;
- private BindingIndependentMappingService mappingService;
-
- private final DomMountPointForwardingManager domForwardingManager = new DomMountPointForwardingManager();
- private final BindingMountPointForwardingManager bindingForwardingManager = new BindingMountPointForwardingManager();
-
- private ConcurrentMap<InstanceIdentifier<?>, BindingIndependentConnector> connectors;
- private ConcurrentMap<InstanceIdentifier<?>, org.opendaylight.yangtools.yang.data.api.InstanceIdentifier> forwarded;
- private ListenerRegistration<MountProvisionListener> domListenerRegistration;
- private ListenerRegistration<org.opendaylight.controller.sal.binding.api.mount.MountProviderService.MountProvisionListener> baListenerRegistration;
-
- public MountProvisionService getDomMountService() {
- return domMountService;
- }
-
- public void setDomMountService(MountProvisionService domMountService) {
- this.domMountService = domMountService;
- }
-
- public void start() {
- if(domMountService != null && baMountService != null) {
- domListenerRegistration = domMountService.registerProvisionListener(domForwardingManager);
- baListenerRegistration = baMountService.registerProvisionListener(bindingForwardingManager);
- }
- }
-
- private void tryToDeployConnector(InstanceIdentifier<?> baPath,
- org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) {
- org.opendaylight.yangtools.yang.data.api.InstanceIdentifier previous = forwarded.putIfAbsent(baPath, biPath);
- if(previous != null) {
- return;
- }
- MountProviderInstance baMountPoint = baMountService.getMountPoint(baPath);
- MountProvisionInstance domMountPoint = domMountService.getMountPoint(biPath);
- BindingIndependentConnector connector = createForwarder(baPath, baMountPoint, domMountPoint);
- connectors.put(baPath, connector);
- connector.startDataForwarding();
- connector.startRpcForwarding();
- connector.startNotificationForwarding();
- }
-
- private BindingIndependentConnector createForwarder(InstanceIdentifier<?> path, MountProviderInstance baMountPoint,
- MountProvisionInstance domMountPoint) {
- BindingIndependentConnector connector = new BindingIndependentConnector();
-
- connector.setBindingDataService(baMountPoint);
- connector.setBindingRpcRegistry(baMountPoint);
- //connector.setBindingNotificationBroker(baMountPoint);
-
- connector.setDomDataService(domMountPoint);
- connector.setDomRpcRegistry(domMountPoint);
- //connector.setDomNotificationBroker(domMountPoint);
- return connector;
- }
-
- public synchronized void tryToDeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath) {
- InstanceIdentifier<?> baPath;
- try {
- baPath = mappingService.fromDataDom(domPath);
- BindingIndependentConnector potentialConnector = connectors.get(baPath);
- if(potentialConnector != null) {
- return;
- }
- tryToDeployConnector(baPath,domPath);
- } catch (DeserializationException e) {
-
- }
- }
-
- public synchronized void tryToDeployBindingForwarder(InstanceIdentifier<?> baPath) {
- BindingIndependentConnector potentialConnector =connectors.get(baPath);
- if(potentialConnector != null) {
- return;
- }
- org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath = mappingService.toDataDom(baPath);
- tryToDeployConnector(baPath, domPath);
- }
-
- public synchronized void undeployBindingForwarder(InstanceIdentifier<?> baPath) {
- // FIXME: Implement closeMountPoint
- }
-
- public synchronized void undeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) {
- // FIXME: Implement closeMountPoint
- }
-
- private class DomMountPointForwardingManager implements MountProvisionListener {
-
- @Override
- public void onMountPointCreated(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) {
- tryToDeployDomForwarder(path);
- }
-
- @Override
- public void onMountPointRemoved(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) {
- undeployDomForwarder(path);
- }
- }
-
- private class BindingMountPointForwardingManager implements
- org.opendaylight.controller.sal.binding.api.mount.MountProviderService.MountProvisionListener {
-
- @Override
- public void onMountPointCreated(InstanceIdentifier<?> path) {
- tryToDeployBindingForwarder(path);
- }
-
- @Override
- public void onMountPointRemoved(InstanceIdentifier<?> path) {
- undeployBindingForwarder(path);
- }
- }
-}
BindingDomConnectorDeployer.startRpcForwarding(mountConnector, baMountPoint, domMountPoint);
BindingDomConnectorDeployer.startNotificationForwarding(mountConnector, baMountPoint, domMountPoint);
// connector.setDomNotificationBroker(domMountPoint);
- return connector;
+ return mountConnector;
}
public synchronized void tryToDeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath) {
L listener) {
return getRpcRegistryChecked().registerRouteChangeListener(listener);
}
+
+ @Override
+ public ListenerRegistration<NotificationInterestListener> registerInterestListener(
+ NotificationInterestListener interestListener) {
+ return getNotificationBrokerChecked().registerInterestListener(interestListener);
+ }
}
def registerMountPoint(MountPointImpl impl) {
//dataBroker?.registerConfigurationReader(impl.mountPath,impl.readWrapper);
//dataBroker?.registerOperationalReader(impl.mountPath,impl.readWrapper);
-
}
override registerProvisionListener(MountProvisionListener listener) {
private static Logger log = LoggerFactory.getLogger(NotificationRouterImpl.class);
private Multimap<QName, Registration<NotificationListener>> listeners = Multimaps.synchronizedSetMultimap(HashMultimap.<QName, Registration<NotificationListener>>create());
-
+// private Registration<NotificationListener> defaultListener;
+
private void sendNotification(CompositeNode notification) {
- QName type = notification.getNodeType();
- Collection<Registration<NotificationListener>> toNotify = listeners.get(type);
+ final QName type = notification.getNodeType();
+ final Collection<Registration<NotificationListener>> toNotify = listeners.get(type);
log.trace("Publishing notification " + type);
- if (toNotify == null) {
- // No listeners were registered - returns.
+ if ((toNotify == null) || toNotify.isEmpty()) {
+ log.debug("No listener registered for handling of notification {}", type);
return;
}
log.error("Uncaught exception in NotificationListener", e);
}
}
-
}
@Override
public void publish(CompositeNode notification) {
sendNotification(notification);
}
-
+
@Override
public Registration<NotificationListener> addNotificationListener(QName notification, NotificationListener listener) {
ListenerRegistration ret = new ListenerRegistration(notification, listener);
+ listeners.put(notification, ret);
return ret;
}
*/
public void onNotification(final NetconfClientSession session, final NetconfMessage message) {
this.device.logger.debug("Received NETCONF notification.", message);
- CompositeNode _notificationBody = null;
- CompositeNode _compositeNode = null;
+ CompositeNode domNotification = null;
if (message != null) {
- _compositeNode = NetconfMapping.toCompositeNode(message,device.getSchemaContext());
+ domNotification = NetconfMapping.toNotificationNode(message, device.getSchemaContext());
}
- if (_compositeNode != null) {
- _notificationBody = NetconfDeviceListener.getNotificationBody(_compositeNode);
- }
- final CompositeNode domNotification = _notificationBody;
- boolean _notEquals = (!Objects.equal(domNotification, null));
- if (_notEquals) {
+ if (domNotification != null) {
MountProvisionInstance _mountInstance = null;
if (this.device != null) {
_mountInstance = this.device.getMountInstance();
import com.google.common.base.Optional
import org.opendaylight.yangtools.yang.model.api.SchemaContext
import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlDocumentUtils
+import org.opendaylight.yangtools.yang.model.api.NotificationDefinition
+import java.util.Set
class NetconfMapping {
}
static def CompositeNode toCompositeNode(NetconfMessage message,Optional<SchemaContext> ctx) {
- return null//message.toRpcResult().result;
+ //TODO: implement general normalization to normalize incoming Netconf Message
+ // for Schema Context counterpart
+ return null
+ }
+
+ static def CompositeNode toNotificationNode(NetconfMessage message,Optional<SchemaContext> ctx) {
+ if (ctx.present) {
+ val schemaContext = ctx.get
+ val notifications = schemaContext.notifications
+ val document = message.document
+ return XmlDocumentUtils.notificationToDomNodes(document, Optional.<Set<NotificationDefinition>>fromNullable(notifications))
+ }
+ return null
}
static def NetconfMessage toRpcMessage(QName rpc, CompositeNode node,Optional<SchemaContext> ctx) {
if(isDataRetrievalReply(rpc)) {
val xmlData = message.document.dataSubtree
- val dataNodes = XmlDocumentUtils.toDomNodes(xmlData,Optional.of(context.get.dataDefinitions))
+ val dataNodes = XmlDocumentUtils.toDomNodes(xmlData, Optional.of(context.get.dataDefinitions))
val it = ImmutableCompositeNode.builder()
setQName(NETCONF_RPC_REPLY_QNAME)
- add(ImmutableCompositeNode.create(NETCONF_DATA_QNAME,dataNodes));
+ add(ImmutableCompositeNode.create(NETCONF_DATA_QNAME, dataNodes));
rawRpc = it.toInstance;
//sys(xmlData)