in gateway-util-common/src/main/java/org/apache/knox/gateway/util/JsonPath.java [212:294]
public List<Match> evaluate( JsonNode root ) {
JsonNode parent;
JsonNode child;
Match newMatch;
List<Match> tempMatches;
List<Match> oldMatches = new ArrayList<>();
List<Match> newMatches = new ArrayList<>();
if( root != null ) {
for( Segment seg : segments ) {
if( Segment.Type.ROOT == seg.getType() ) {
oldMatches.add( new Match( null, segments.get( 0 ), root, null, -1 ) );
continue;
} else {
for( Match oldMatch : oldMatches ) {
parent = oldMatch.getNode();
switch( seg.getType() ) {
case FIELD:
if( JsonNodeType.OBJECT == oldMatch.getNode().getNodeType() ) {
child = oldMatch.getNode().get( seg.getField() );
if( child == null ) {
continue;
} else {
newMatches.add( new Match( oldMatch, seg, child, seg.getField() ) );
}
} else {
continue;
}
break;
case INDEX:
if( JsonNodeType.ARRAY == oldMatch.getNode().getNodeType() ) {
child = oldMatch.getNode().get( seg.getIndex() );
if( child == null ) {
continue;
} else {
newMatches.add( new Match( oldMatch, seg, child, seg.getIndex() ) );
}
} else {
continue;
}
break;
case GLOB:
newMatches.add( oldMatch );
case WILD:
switch( parent.getNodeType() ) {
case OBJECT:
Iterator<Map.Entry<String,JsonNode>> fields = parent.fields();
while( fields.hasNext() ) {
Map.Entry<String,JsonNode> field = fields.next();
newMatch = new Match( oldMatch, seg, field.getValue(), field.getKey() );
newMatches.add( newMatch );
if( seg.getType() == Segment.Type.GLOB ) {
addAllChildren( oldMatch, newMatches, field.getValue() );
}
}
break;
case ARRAY:
for( int i=0, n=parent.size(); i<n; i++ ) {
newMatch = new Match( oldMatch, seg, parent.get( i ), i );
newMatches.add( newMatch );
if( seg.getType() == Segment.Type.GLOB ) {
addAllChildren( oldMatch, newMatches, newMatch.getNode() );
}
}
break;
}
break;
default:
throw new IllegalStateException();
}
}
if( newMatches.isEmpty() ) {
return newMatches;
} else {
tempMatches = oldMatches;
oldMatches = newMatches;
newMatches = tempMatches;
newMatches.clear();
}
}
}
}
return oldMatches;
}