Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 package com.facebook.presto.operator.scalar;
 
 
 import static com.facebook.presto.spi.StandardErrorCode.INVALID_FUNCTION_ARGUMENT;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static java.lang.Character.isLetterOrDigit;
 import static java.lang.String.format;
 
 public class JsonPathTokenizer
         extends AbstractIterator<String>
 {
     private static final char QUOTE = '\"';
     private static final char DOT = '.';
     private static final char OPEN_BRACKET = '[';
     private static final char CLOSE_BRACKET = ']';
     private static final char UNICODE_CARET = '\u2038';
 
     private final String path;
     private int index;
 
     public JsonPathTokenizer(String path)
     {
         this. = checkNotNull(path"path is null");
 
         if (path.isEmpty()) {
             throw invalidJsonPath();
         }
 
         // skip the start token
         match('$');
     }
 
     @Override
     protected String computeNext()
     {
         if (!hasNextCharacter()) {
             return endOfData();
         }
 
         if (tryMatch()) {
             return matchPathSegment();
         }
 
         if (tryMatch()) {
             String token = tryMatch() ? matchQuotedSubscript() : matchUnquotedSubscript();
 
             match();
             return token;
         }
 
         throw invalidJsonPath();
     }
 
     private String matchPathSegment()
     {
         // seek until we see a special character or whitespace
         int start = ;
         while (hasNextCharacter() && isUnquotedPathCharacter(peekCharacter())) {
             nextCharacter();
         }
         int end = ;
 
         String token = .substring(startend);
 
         // an empty unquoted token is not allowed
         if (token.isEmpty()) {
             throw invalidJsonPath();
         }
 
         return token;
     }
 
     private static boolean isUnquotedPathCharacter(char c)
     {
         return c == ':' || isUnquotedSubscriptCharacter(c);
     }
 
     private String matchUnquotedSubscript()
     {
         // seek until we see a special character or whitespace
         int start = ;
         while (hasNextCharacter() && isUnquotedSubscriptCharacter(peekCharacter())) {
             nextCharacter();
         }
        int end = ;
        String token = .substring(startend);
        // an empty unquoted token is not allowed
        if (token.isEmpty()) {
            throw invalidJsonPath();
        }
        return token;
    }
    private static boolean isUnquotedSubscriptCharacter(char c)
    {
        return c == '_' || isLetterOrDigit(c);
    }
    private String matchQuotedSubscript()
    {
        // quote has already been matched
        // seek until we see the close quote
        int start = ;
        while (hasNextCharacter() && peekCharacter() != ) {
            nextCharacter();
        }
        int end = ;
        String token = .substring(startend);
        match();
        return token;
    }
    private boolean hasNextCharacter()
    {
        return  < .length();
    }
    private void match(char expected)
    {
        if (!tryMatch(expected)) {
            throw invalidJsonPath();
        }
    }
    private boolean tryMatch(char expected)
    {
        if (peekCharacter() != expected) {
            return false;
        }
        ++;
        return true;
    }
    private void nextCharacter()
    {
        ++;
    }
    private char peekCharacter()
    {
        return .charAt();
    }
    {
        return new PrestoException(format("Invalid JSON path: '%s'"));
    }
    @Override
    public String toString()
    {
        return .substring(0, ) +  + .substring();
    }
New to GrepCode? Check out our FAQ X