private List parse()

in gateway-util-common/src/main/java/org/apache/knox/gateway/util/JsonPath.java [106:210]


    private List<Segment> parse( String expression ) {
      boolean insideBrackets = false;
      boolean expectChild = false;
      boolean foundChild = false;
      List<Segment> list = null;
      Segment segment;
      StringTokenizer parser = new StringTokenizer( expression, "$.[]()@?:,", true );
      String currToken = null;
      String prevToken;
      while( parser.hasMoreTokens() ) {
        prevToken = currToken;
        if( insideBrackets ) {
          currToken = parser.nextToken( "$[]()@?:," ).trim();
        } else {
          currToken = parser.nextToken( "$.[]()@?:," ).trim();
        }
        char c = currToken.charAt( 0 );
        switch( c ) {
          case '$' :
            if( list != null ) {
              throw new IllegalArgumentException( expression );
            }
            list = new ArrayList<>();
            segment = new Segment( Segment.Type.ROOT );
            list.add( segment );
            break;
          case '.' :
            if( expectChild ) {
              if( ".".equals( prevToken ) ) {
                segment = new Segment( Segment.Type.GLOB );
                if(list == null) {
                  throw new IllegalArgumentException( expression );
                }
                list.add( segment );
                expectChild = true;
                foundChild = false;
              } else {
                throw new IllegalArgumentException( expression );
              }
            } else {
              expectChild = true;
              foundChild = false;
            }
            break;
          case '[' :
            if( expectChild ) {
              throw new IllegalArgumentException( expression );
            }
            insideBrackets = true;
            expectChild = true;
            foundChild = false;
            break;
          case ']' :
            if( !foundChild ) {
              throw new IllegalArgumentException( expression );
            }
            insideBrackets = false;
            expectChild = false;
            foundChild = false;
            break;
          case '(':
          case ')':
          case '@':
          case '?':
          case ':':
          case ',':
            throw new IllegalArgumentException( expression );
          default:
            if( !expectChild ) {
              throw new IllegalArgumentException( expression );
            } else if( Character.isDigit( c ) ) {
              try {
                segment = new Segment( Integer.parseInt( currToken ) );
              } catch( NumberFormatException e ) {
                throw new IllegalArgumentException( expression, e );
              }
            } else {
              if( "*".equals( currToken ) ) {
                segment = new Segment( Segment.Type.WILD );
              } else if ( "**".equals( currToken ) ) {
                segment = new Segment( Segment.Type.GLOB );
              } else {
                if( currToken.startsWith( "'" ) ) {
                  currToken = currToken.substring( 1 );
                }
                if( currToken.endsWith( "'" ) ) {
                  currToken = currToken.substring( 0, currToken.length()-1 );
                }
                segment = new Segment( currToken );
              }
            }
            if(list == null) {
              throw new IllegalArgumentException( expression );
            }
            list.add( segment );
            expectChild = false;
            foundChild = true;
            break;
        }
      }
      if( expectChild && !foundChild ) {
        throw new IllegalArgumentException( expression );
      }
      return list;
    }