From 3a44ea91890b43ea033041a45c1ca31fb7a813a8 Mon Sep 17 00:00:00 2001 From: Maros Marsalek Date: Thu, 5 Jun 2014 14:03:07 +0200 Subject: [PATCH] BUG-1041 Make rpc-request -> xml translation use schema context Sal-netconf-connector now uses schema context if available to transform between rpc-request represented as DOM nodes to Xml. This is crucial for e.g. identity-ref type leaves in edit-config. Change-Id: I5b8602e7bf21e52c27b94daa3ac55213375641b5 Signed-off-by: Maros Marsalek --- .../mapping/NetconfMessageTransformer.java | 19 ++- .../util/NetconfMessageTransformUtil.java | 37 ++++- .../netconf/util/NodeContainerProxy.java | 140 ++++++++++++++++++ 3 files changed, 189 insertions(+), 7 deletions(-) create mode 100644 opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/util/NodeContainerProxy.java diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java index c85a52909d..2adc1be79e 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java @@ -7,12 +7,11 @@ */ package org.opendaylight.controller.sal.connect.netconf.schema.mapping; +import com.google.common.base.Optional; import java.util.Collections; import java.util.List; import java.util.Set; - import javax.activation.UnsupportedDataTypeException; - import org.opendaylight.controller.netconf.api.NetconfMessage; import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.controller.sal.connect.api.MessageTransformer; @@ -24,15 +23,15 @@ import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.impl.CompositeNodeTOImpl; import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode; +import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlCodecProvider; import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlDocumentUtils; import org.opendaylight.yangtools.yang.data.impl.util.CompositeNodeBuilder; +import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.w3c.dom.Document; import org.w3c.dom.Element; -import com.google.common.base.Optional; - public class NetconfMessageTransformer implements MessageTransformer { public static final String MESSAGE_ID_PREFIX = "m"; @@ -65,7 +64,17 @@ public class NetconfMessageTransformer implements MessageTransformer + * {@code + * rpc + * edit-config + * config + * // All schema nodes from remote schema + * config + * edit-config + * rpc + * } + * + * + * This makes the translation of rpc edit-config request(especially the config node) + * to xml use schema which is crucial for some types of nodes e.g. identity-ref. + */ + public static DataNodeContainer createSchemaForEdit(final SchemaContext schemaContext) { + final QName config = QName.create(NETCONF_EDIT_CONFIG_QNAME, "config"); + final QName editConfig = QName.create(NETCONF_EDIT_CONFIG_QNAME, "edit-config"); + final NodeContainerProxy configProxy = new NodeContainerProxy(config, schemaContext.getChildNodes()); + final NodeContainerProxy editConfigProxy = new NodeContainerProxy(editConfig, Sets.newHashSet(configProxy)); + return new NodeContainerProxy(NETCONF_RPC_QNAME, Sets.newHashSet(editConfigProxy)); + } + public static CompositeNodeTOImpl wrap(final QName name, final Node node) { if (node != null) { return new CompositeNodeTOImpl(name, null, Collections.> singletonList(node)); diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/util/NodeContainerProxy.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/util/NodeContainerProxy.java new file mode 100644 index 0000000000..bd075d0606 --- /dev/null +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/util/NodeContainerProxy.java @@ -0,0 +1,140 @@ +/* + * 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.connect.netconf.util; + +import com.google.common.base.Preconditions; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; +import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition; +import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; +import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; +import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; +import org.opendaylight.yangtools.yang.model.api.SchemaPath; +import org.opendaylight.yangtools.yang.model.api.Status; +import org.opendaylight.yangtools.yang.model.api.TypeDefinition; +import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +import org.opendaylight.yangtools.yang.model.api.UsesNode; + +class NodeContainerProxy implements ContainerSchemaNode { + + private final Map childNodes; + private final QName qName; + + public NodeContainerProxy(final QName qName, final Map childNodes) { + this.childNodes = Preconditions.checkNotNull(childNodes, "childNodes"); + this.qName = Preconditions.checkNotNull(qName, "qName"); + } + + public NodeContainerProxy(final QName qName, final Set childNodes) { + this(qName, asMap(childNodes)); + } + + private static Map asMap(final Set childNodes) { + final Map mapped = Maps.newHashMap(); + for (final DataSchemaNode childNode : childNodes) { + mapped.put(childNode.getQName(), childNode); + } + return mapped; + } + + @Override + public Set> getTypeDefinitions() { + return Collections.emptySet(); + } + + @Override + public Set getChildNodes() { + return Sets.newHashSet(childNodes.values()); + } + + @Override + public Set getGroupings() { + return Collections.emptySet(); + } + + @Override + public DataSchemaNode getDataChildByName(final QName qName) { + return childNodes.get(qName); + } + + @Override + public DataSchemaNode getDataChildByName(final String s) { + throw new UnsupportedOperationException(); + } + + @Override + public Set getUses() { + return Collections.emptySet(); + } + + @Override + public boolean isPresenceContainer() { + throw new UnsupportedOperationException(); + } + + @Override + public Set getAvailableAugmentations() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isAugmenting() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isAddedByUses() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean isConfiguration() { + throw new UnsupportedOperationException(); + } + + @Override + public ConstraintDefinition getConstraints() { + throw new UnsupportedOperationException(); + } + + @Override + public QName getQName() { + return qName; + } + + @Override + public SchemaPath getPath() { + throw new UnsupportedOperationException(); + } + + @Override + public String getDescription() { + throw new UnsupportedOperationException(); + } + + @Override + public String getReference() { + throw new UnsupportedOperationException(); + } + + @Override + public Status getStatus() { + throw new UnsupportedOperationException(); + } + + @Override + public List getUnknownSchemaNodes() { + return Collections.emptyList(); + } +} -- 2.36.6