+ public static DOMResult prepareDomResultForActionRequest(final DataSchemaContextTree dataSchemaContextTree,
+ final DOMDataTreeIdentifier domDataTreeIdentifier, final SchemaPath actionSchemaPath,
+ final MessageCounter counter, final String action) {
+ final Document document = XmlUtil.newDocument();
+ final Element rpcNS =
+ document.createElementNS(NETCONF_RPC_QNAME.getNamespace().toString(), NETCONF_RPC_QNAME.getLocalName());
+ // set msg id
+ rpcNS.setAttribute(MESSAGE_ID_ATTR, counter.getNewMessageId(MESSAGE_ID_PREFIX));
+
+ final Element actionNS = document.createElementNS(NETCONF_ACTION_NAMESPACE.toString(), NETCONF_ACTION);
+ final DataSchemaContextNode<?> rootSchemaContextNode = dataSchemaContextTree.getRoot();
+ final Element actionData = prepareActionData(rootSchemaContextNode, actionNS,
+ domDataTreeIdentifier.getRootIdentifier().getPathArguments().iterator(), document);
+
+ final Element specificActionElement = document.createElement(action);
+ actionData.appendChild(specificActionElement);
+ rpcNS.appendChild(actionNS);
+ document.appendChild(rpcNS);
+ return new DOMResult(specificActionElement);
+ }
+
+ private static Element prepareActionData(final DataSchemaContextNode<?> currentParentSchemaNode,
+ final Element actionNS, final Iterator<PathArgument> iterator, final Document document) {
+ if (iterator.hasNext()) {
+ final PathArgument next = iterator.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) {
+ actualElement.setNodeValue(((NodeWithValue) next).getValue().toString());
+ } else if (next instanceof NodeIdentifierWithPredicates) {
+ for (Entry<QName, Object> entry : ((NodeIdentifierWithPredicates) next).getKeyValues().entrySet()) {
+ final Element entryElement = document.createElementNS(entry.getKey().getNamespace().toString(),
+ entry.getKey().getLocalName());
+ entryElement.setTextContent(entry.getValue().toString());
+ entryElement.setNodeValue(entry.getValue().toString());
+ actualElement.appendChild(entryElement);
+ }
+ }
+ actionNS.appendChild(actualElement);
+ return prepareActionData(current, actualElement, iterator, document);
+ } else {
+ return actionNS;
+ }
+ }
+