import javax.ws.rs.Consumes;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.ext.Provider;
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.XMLStreamException;
import javax.xml.transform.dom.DOMSource;
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.yangtools.yang.common.ErrorType;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
-import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream;
import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree;
-import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
import org.opendaylight.yangtools.yang.model.api.SchemaNode;
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
}
private static PatchContext parse(final InstanceIdentifierContext pathContext, final Document doc)
- throws XMLStreamException, IOException, ParserConfigurationException, SAXException, URISyntaxException {
+ throws XMLStreamException, IOException, SAXException, URISyntaxException {
final List<PatchEntity> resultCollection = new ArrayList<>();
final String patchId = doc.getElementsByTagName("patch-id").item(0).getFirstChild().getNodeValue();
final NodeList editNodes = doc.getElementsByTagName("edit");
for (int i = 0; i < editNodes.getLength(); i++) {
- DataSchemaNode schemaNode = (DataSchemaNode) pathContext.getSchemaNode();
final Element element = (Element) editNodes.item(i);
final String operation = element.getElementsByTagName("operation").item(0).getFirstChild().getNodeValue();
final PatchEditOperation oper = PatchEditOperation.valueOf(operation.toUpperCase(Locale.ROOT));
final var lookup = DataSchemaContextTree.from(pathContext.getSchemaContext())
.enterPath(targetII).orElseThrow();
- schemaNode = lookup.node().getDataSchemaNode();
final var stack = lookup.stack();
inference = stack.toInference();
if (!stack.isEmpty()) {
}
if (oper.isWithValue()) {
- final NormalizedNode parsed;
- if (schemaNode instanceof ContainerSchemaNode || schemaNode instanceof ListSchemaNode) {
- final NormalizedNodeResult resultHolder = new NormalizedNodeResult();
- final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder);
- final XmlParserStream xmlParser = XmlParserStream.create(writer, inference);
- xmlParser.traverse(new DOMSource(firstValueElement));
- parsed = resultHolder.getResult();
- } else {
- parsed = null;
- }
-
+ final NormalizedNodeResult resultHolder = new NormalizedNodeResult();
+ final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder);
+ final XmlParserStream xmlParser = XmlParserStream.create(writer, inference);
+ xmlParser.traverse(new DOMSource(firstValueElement));
// for lists allow to manipulate with list items through their parent
if (targetII.getLastPathArgument() instanceof NodeIdentifierWithPredicates) {
targetII = targetII.getParent();
}
-
- resultCollection.add(new PatchEntity(editId, oper, targetII, parsed));
+ resultCollection.add(new PatchEntity(editId, oper, targetII, resultHolder.getResult()));
} else {
resultCollection.add(new PatchEntity(editId, oper, targetII));
}
import java.nio.charset.StandardCharsets;
import javax.ws.rs.core.MediaType;
import org.junit.BeforeClass;
-import org.junit.Ignore;
import org.junit.Test;
import org.opendaylight.restconf.common.errors.RestconfDocumentedException;
import org.opendaylight.restconf.nb.rfc8040.jersey.providers.test.AbstractBodyReaderTest;
/**
* Test of Yang Patch on the leaf set node element.
- * TODO: Remove ignore when NETCONF-937 will be resolved
*/
- @Ignore
@Test
public void modulePatchTargetLeafSetNodeTest() throws Exception {
mockBodyReader("", xmlToPatchBodyReader, false);
final var expectedData = Builders.leafSetBuilder()
.withNodeIdentifier(new NodeIdentifier(LEAF_SET_QNAME))
.withChild(Builders.leafSetEntryBuilder()
- .withNodeIdentifier(new NodeWithValue(LEAF_SET_QNAME, "data1"))
+ .withNodeIdentifier(new NodeWithValue<>(LEAF_SET_QNAME, "data1"))
.withValue("data1")
.build())
.build();
assertEquals(CHOICE_CONT_QNAME, data.getIdentifier().getNodeType());
assertEquals(expectedData, data);
}
+
+ /**
+ * Test reading simple leaf value.
+ */
+ @Test
+ public void modulePatchSimpleLeafValueTest() throws Exception {
+ mockBodyReader("instance-identifier-patch-module:patch-cont/my-list1=leaf1", xmlToPatchBodyReader, false);
+ final var inputStream = new ByteArrayInputStream("""
+ <yang-patch xmlns="urn:ietf:params:xml:ns:yang:ietf-yang-patch">
+ <patch-id>test-patch</patch-id>
+ <comment>this is test patch</comment>
+ <edit>
+ <edit-id>edit1</edit-id>
+ <operation>replace</operation>
+ <target>/my-list2=my-leaf20/name</target>
+ <value>
+ <name xmlns="instance:identifier:patch:module">my-leaf20</name>
+ </value>
+ </edit>
+ </yang-patch>
+ """.getBytes(StandardCharsets.UTF_8));
+ final var returnValue = xmlToPatchBodyReader.readFrom(null, null, null, mediaType, null, inputStream);
+ checkPatchContext(returnValue);
+ final var data = returnValue.getData().get(0).getNode();
+ assertEquals(LEAF_NAME_QNAME, data.getIdentifier().getNodeType());
+ assertEquals(ImmutableNodes.leafNode(LEAF_NAME_QNAME, "my-leaf20"), data);
+ }
}