public class YangUtils {
private static final String XPATH_DELIMITER_REGEX = "\\/";
- private static final String XPATH_NODE_KEY_ATTRIBUTES_REGEX = "\\[.+";
+ private static final String XPATH_NODE_KEY_ATTRIBUTES_REGEX = "\\[.*?\\]";
+ //Might cause an issue with [] inside [] in key-values
/**
* Parses jsonData into NormalizedNode according to given schema context.
}
private static String[] xpathToNodeIdSequence(final String xpath) {
- final String[] xpathNodeIdSequence = Arrays.stream(xpath.split(XPATH_DELIMITER_REGEX))
- .map(identifier -> identifier.replaceFirst(XPATH_NODE_KEY_ATTRIBUTES_REGEX, ""))
- .filter(identifier -> !identifier.isEmpty())
- .toArray(String[]::new);
+ final String[] xpathNodeIdSequence = Arrays.stream(xpath
+ .replaceAll(XPATH_NODE_KEY_ATTRIBUTES_REGEX, "")
+ .split(XPATH_DELIMITER_REGEX))
+ .filter(identifier -> !identifier.isEmpty())
+ .toArray(String[]::new);
if (xpathNodeIdSequence.length < 1) {
throw new DataValidationException("Invalid xpath.", "Xpath contains no node identifiers.");
}
noExceptionThrown()
}
+ def 'Parsing xPath to nodeId for #scenario.'() {
+ when: 'xPath is parsed'
+ def result = YangUtils.xpathToNodeIdSequence(xPath)
+ then: 'result represents an array of expected identifiers'
+ assert result == expectedNodeIdentifier
+ where: 'the following parameters are used'
+ scenario | xPath || expectedNodeIdentifier
+ 'container xpath' | '/test-tree' || ['test-tree']
+ 'xpath contains list attribute' | '/test-tree/branch[@name=\'Branch\']' || ['test-tree','branch']
+ 'xpath contains list attributes with /' | '/test-tree/branch[@name=\'/Branch\']/categories[@id=\'/broken\']' || ['test-tree','branch','categories']
+ }
+
}