*/
package org.opendaylight.netconf.sal.connect.netconf.util;
+import static org.opendaylight.netconf.util.NetconfUtil.NETCONF_DATA_QNAME;
+import static org.opendaylight.netconf.util.NetconfUtil.NETCONF_QNAME;
+
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
import java.io.IOException;
import java.net.URI;
import java.time.Instant;
import org.opendaylight.netconf.notifications.NetconfNotification;
import org.opendaylight.netconf.sal.connect.util.MessageCounter;
import org.opendaylight.netconf.util.NetconfUtil;
+import org.opendaylight.netconf.util.NodeContainerProxy;
import org.opendaylight.netconf.util.messages.NetconfMessageUtil;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.edit.config.input.EditContent;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInput;
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.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.codec.xml.XMLStreamNormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
public static final QName IETF_NETCONF_NOTIFICATIONS =
QName.create(NetconfCapabilityChange.QNAME, "ietf-netconf-notifications").intern();
- public static final QName NETCONF_QNAME =
- QName.create("urn:ietf:params:xml:ns:netconf:base:1.0", "2011-06-01", "netconf").intern();
public static final URI NETCONF_URI = NETCONF_QNAME.getNamespace();
- public static final QName NETCONF_DATA_QNAME = QName.create(NETCONF_QNAME, "data").intern();
public static final NodeIdentifier NETCONF_DATA_NODEID = NodeIdentifier.create(NETCONF_DATA_QNAME);
public static final QName NETCONF_RPC_REPLY_QNAME = QName.create(NETCONF_QNAME, "rpc-reply").intern();
+ public static final NodeIdentifier NETCONF_RPC_REPLY_NODEID = NodeIdentifier.create(NETCONF_RPC_REPLY_QNAME);
+
public static final QName NETCONF_OK_QNAME = QName.create(NETCONF_QNAME, "ok").intern();
public static final QName NETCONF_ERROR_OPTION_QNAME = QName.create(NETCONF_QNAME, "error-option").intern();
public static final NodeIdentifier NETCONF_ERROR_OPTION_NODEID = NodeIdentifier.create(NETCONF_ERROR_OPTION_QNAME);
public static final ContainerNode CREATE_SUBSCRIPTION_RPC_CONTENT = Builders.containerBuilder()
.withNodeIdentifier(NodeIdentifier.create(CREATE_SUBSCRIPTION_RPC_QNAME)).build();
- private static final NodeIdentifier NETCONF_FILTER_NODEID = NodeIdentifier.create(NETCONF_FILTER_QNAME);
+ public static final SchemaPath CREATE_SUBSCRIPTION_RPC_PATH = toPath(CREATE_SUBSCRIPTION_RPC_QNAME);
+
+ public static final NodeIdentifier NETCONF_FILTER_NODEID = NodeIdentifier.create(NETCONF_FILTER_QNAME);
public static final DataContainerChild<?, ?> EMPTY_FILTER;
final Optional<ModifyAction> operation,
final Optional<NormalizedNode<?, ?>> lastChildOverride) {
final NormalizedNode<?, ?> configContent;
-
+ final NormalizedMetadata metadata;
if (dataPath.isEmpty()) {
Preconditions.checkArgument(lastChildOverride.isPresent(),
"Data has to be present when creating structure for top level element");
"Data has to be either container or a list node when creating structure for top level element, "
+ "but was: %s", lastChildOverride.get());
configContent = lastChildOverride.get();
+ metadata = null;
} else {
configContent = ImmutableNodes.fromInstanceId(ctx, dataPath, lastChildOverride);
+ metadata = operation.map(oper -> leafMetadata(dataPath, oper)).orElse(null);
}
- final NormalizedMetadata metadata = operation.map(oper -> leafMetadata(configContent, oper)).orElse(null);
final Element element = XmlUtil.createElement(BLANK_DOCUMENT, NETCONF_CONFIG_QNAME.getLocalName(),
Optional.of(NETCONF_CONFIG_QNAME.getNamespace().toString()));
.build();
}
- private static NormalizedMetadata leafMetadata(final NormalizedNode<?, ?> node, final ModifyAction oper) {
- final Deque<Builder> builders = new ArrayDeque<>();
+ private static NormalizedMetadata leafMetadata(final YangInstanceIdentifier path, final ModifyAction oper) {
+ final List<PathArgument> args = path.getPathArguments();
+ final Deque<Builder> builders = new ArrayDeque<>(args.size());
// Step one: open builders
- NormalizedNode<?, ?> currentNode = node;
- do {
- builders.push(ImmutableNormalizedMetadata.builder().withIdentifier(currentNode.getIdentifier()));
- if (currentNode instanceof NormalizedNodeContainer) {
- final Collection<NormalizedNode<?, ?>> children =
- ((NormalizedNodeContainer<?, ?, NormalizedNode<?, ?>>) currentNode).getValue();
- switch (children.size()) {
- case 0:
- currentNode = null;
- break;
- case 1:
- currentNode = Iterables.getOnlyElement(children);
- break;
- default:
- throw new IllegalStateException("Unexpected container " + currentNode);
- }
- } else {
- currentNode = null;
- }
- } while (currentNode != null);
+ for (PathArgument arg : args) {
+ builders.push(ImmutableNormalizedMetadata.builder().withIdentifier(arg));
+ }
// Step two: set the top builder's metadata
builders.peek().withAnnotation(NETCONF_OPERATION_QNAME_LEGACY, oper.toString().toLowerCase(Locale.US));
final Element actionData = prepareActionData(rootSchemaContextNode, actionNS,
domDataTreeIdentifier.getRootIdentifier().getPathArguments().iterator(), document);
- Element specificActionElement = document.createElement(action);
+ final Element specificActionElement = document.createElement(action);
actionData.appendChild(specificActionElement);
rpcNS.appendChild(actionNS);
document.appendChild(rpcNS);
final Element actionNS, final Iterator<PathArgument> iterator, final Document document) {
if (iterator.hasNext()) {
final PathArgument next = iterator.next();
- final QName actualNS = next.getNodeType();
- DataSchemaContextNode<?> current = currentParentSchemaNode.getChild(next);
+ final DataSchemaContextNode<?> current = currentParentSchemaNode.getChild(next);
Preconditions.checkArgument(current != null, "Invalid input: schema for argument %s not found", next);
if (current.isMixin()) {
return prepareActionData(current, actionNS, iterator, document);
}
+ final QName actualNS = next.getNodeType();
final Element actualElement = document.createElementNS(actualNS.getNamespace().toString(),
actualNS.getLocalName());
if (next instanceof NodeWithValue) {