public List evaluate()

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;
    }