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