package org.opendaylight.controller.sal.restconf.impl
-import javax.ws.rs.WebApplicationException
import javax.ws.rs.core.Response
import org.opendaylight.controller.md.sal.common.api.data.DataReader
import org.opendaylight.controller.sal.core.api.Broker.ConsumerSession
private String localName;
private URI namespace;
+ private QName name;
private List<NodeWrapper<?>> values = new ArrayList<>();
public CompositeNodeWrapper(String localName) {
this(localName);
this.namespace = namespace;
}
+
+ @Override
+ public void setQname(QName name) {
+ Preconditions.checkState(compositeNode == null, "Cannot change the object, due to data inconsistencies.");
+ this.name = name;
+ }
@Override
public String getLocalName() {
@Override
public CompositeNode unwrap(CompositeNode parent) {
if (compositeNode == null) {
- Preconditions.checkNotNull(namespace);
- compositeNode = NodeFactory.createMutableCompositeNode(new QName(namespace, localName),
- parent, new ArrayList<Node<?>>(), ModifyAction.CREATE, null);
+ if (name == null) {
+ Preconditions.checkNotNull(namespace);
+ name = new QName(namespace, localName);
+ }
+ compositeNode = NodeFactory.createMutableCompositeNode(name, parent, new ArrayList<Node<?>>(), null, null);
List<Node<?>> nodeValues = new ArrayList<>();
for (NodeWrapper<?> nodeWrapper : values) {
values = null;
namespace = null;
localName = null;
+ name = null;
}
return compositeNode;
}
private def dispatch CharSequence toRestconfIdentifier(PathArgument argument, DataSchemaNode node) {
throw new IllegalArgumentException("Conversion of generic path argument is not supported");
}
+
+ def findModuleByNamespace(URI namespace) {
+ checkPreconditions
+ var module = uriToModuleName.get(namespace)
+ if (module === null) {
+ val moduleSchemas = schemas.findModuleByNamespace(namespace);
+ if(moduleSchemas === null) throw new IllegalArgumentException()
+ var latestModule = moduleSchemas.head
+ for (m : moduleSchemas) {
+ if (m.revision.after(latestModule.revision)) {
+ latestModule = m
+ }
+ }
+ if(latestModule === null) throw new IllegalArgumentException()
+ uriToModuleName.put(namespace, latestModule.name)
+ module = latestModule.name;
+ }
+ return module
+ }
def CharSequence toRestconfIdentifier(QName qname) {
checkPreconditions
import java.net.URI;
+import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.CompositeNode;
import org.opendaylight.yangtools.yang.data.api.Node;
public interface NodeWrapper<T extends Node<?>> {
+ void setQname(QName name);
+
T unwrap(CompositeNode parent);
URI getNamespace();
package org.opendaylight.controller.sal.restconf.impl
import java.util.List
+import java.util.Set
import javax.ws.rs.core.Response
import org.opendaylight.controller.md.sal.common.api.TransactionStatus
import org.opendaylight.controller.sal.rest.api.RestconfService
import org.opendaylight.yangtools.yang.data.api.CompositeNode
+import org.opendaylight.yangtools.yang.model.api.ChoiceNode
import org.opendaylight.yangtools.yang.model.api.DataNodeContainer
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode
override readConfigurationData(String identifier) {
val instanceIdentifierWithSchemaNode = identifier.resolveInstanceIdentifier
- val data = broker.readOperationalData(instanceIdentifierWithSchemaNode.getInstanceIdentifier);
+ val data = broker.readConfigurationData(instanceIdentifierWithSchemaNode.getInstanceIdentifier);
return new StructuredData(data, instanceIdentifierWithSchemaNode.schemaNode)
}
}
private def void addNamespaceToNodeFromSchemaRecursively(NodeWrapper<?> nodeBuilder, DataSchemaNode schema) {
- if (nodeBuilder.namespace === null) {
- nodeBuilder.namespace = schema.QName.namespace
+ if (schema === null) {
+ throw new ResponseException(Response.Status.BAD_REQUEST,
+ "Data has bad format\n" + nodeBuilder.localName + " does not exist in yang schema.");
+ }
+ val moduleName = controllerContext.findModuleByNamespace(schema.QName.namespace);
+ if (nodeBuilder.namespace === null || nodeBuilder.namespace == schema.QName.namespace ||
+ nodeBuilder.namespace.path == moduleName) {
+ nodeBuilder.qname = schema.QName
+ } else {
+ throw new ResponseException(Response.Status.BAD_REQUEST,
+ "Data has bad format\nIf data is in XML format then namespace for " + nodeBuilder.localName +
+ " should be " + schema.QName.namespace + ".\n If data is in Json format then module name for " +
+ nodeBuilder.localName + " should be " + moduleName + ".");
}
if (nodeBuilder instanceof CompositeNodeWrapper) {
val List<NodeWrapper<?>> children = (nodeBuilder as CompositeNodeWrapper).getValues
for (child : children) {
addNamespaceToNodeFromSchemaRecursively(child,
- (schema as DataNodeContainer).childNodes.findFirst[n|n.QName.localName.equals(child.localName)])
+ findFirstSchemaByLocalName(child.localName, (schema as DataNodeContainer).childNodes))
+ }
+ }
+ }
+
+ private def DataSchemaNode findFirstSchemaByLocalName(String localName, Set<DataSchemaNode> schemas) {
+ for (schema : schemas) {
+ if (schema instanceof ChoiceNode) {
+ for (caze : (schema as ChoiceNode).cases) {
+ val result = findFirstSchemaByLocalName(localName, caze.childNodes)
+ if (result !== null) {
+ return result
+ }
+ }
+ } else {
+ return schemas.findFirst[n|n.QName.localName.equals(localName)]
}
}
+ return null
}
}
private String localName;
private String value;
private URI namespace;
+ private QName name;
public SimpleNodeWrapper(String localName, String value) {
this.localName = Preconditions.checkNotNull(localName);
this.namespace = namespace;
}
+ @Override
+ public void setQname(QName name) {
+ Preconditions.checkState(simpleNode == null, "Cannot change the object, due to data inconsistencies.");
+ this.name = name;
+ }
+
@Override
public String getLocalName() {
if (simpleNode != null) {
@Override
public SimpleNode<String> unwrap(CompositeNode parent) {
if (simpleNode == null) {
- Preconditions.checkNotNull(namespace);
- simpleNode = NodeFactory.createImmutableSimpleNode(new QName(namespace, localName), parent, value);
+ if (name == null) {
+ Preconditions.checkNotNull(namespace);
+ name = new QName(namespace, localName);
+ }
+ simpleNode = NodeFactory.createImmutableSimpleNode(name, parent, value);
value = null;
namespace = null;
localName = null;
+ name = null;
}
return simpleNode;
}