@Override
ArrayQueryNode parse() throws ParseException {
final JsonNode value = node.path(DESCENDANT_PROPERTY);
if (!value.isArray()) {
throw new ParseException("Invalid property'" + DESCENDANT_PROPERTY + "': value is not an array");
}
final ArrayQueryNode arrayNode = new ArrayQueryNode();
final Iterator<JsonNode> elements = value.getElements();
while (elements.hasNext()) {
final JsonNode element = elements.next();
// parse occur
final OccurPropertyParser occurParser = new OccurPropertyParser(element, field);
Modifier mod = null;
if (occurParser.isPropertyDefined()) {
mod = occurParser.parse();
}
// parse level
final LevelPropertyParser levelParser = new LevelPropertyParser(element, field);
int level = -1;
if (levelParser.isPropertyDefined()) {
level = levelParser.parse();
}
// check if there is either a node or a twig property and parse it
QueryNode queryNode = null;
if (element.has(NodePropertyParser.NODE_PROPERTY)) {
final NodePropertyParser nodeParser = new NodePropertyParser(element, field);
queryNode = nodeParser.parse();
}
if (element.has(TwigPropertyParser.TWIG_PROPERTY)) {
final TwigPropertyParser twigParser = new TwigPropertyParser(element, field);
queryNode = twigParser.parse();
}
// check if either a node or twig property has been defined
if (queryNode == null) {
throw new ParseException("Invalid property'" + DESCENDANT_PROPERTY + "': one array object does not define a twig or node query");
}
// create a descendant query node and add it to the array query node
arrayNode.add(new DescendantQueryNode(queryNode, mod, level));
}