    1   /*
    2    * Copyright 1999-2004 The Apache Software Foundation
    3    *
    4    * Licensed under the Apache License, Version 2.0 (the "License");
    5    * you may not use this file except in compliance with the License.
    6    * You may obtain a copy of the License at
    7    *
    8    *     http://www.apache.org/licenses/LICENSE-2.0
    9    *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  package org.apache.commons.jxpath.ri;
    17
    18  import java.io.StringReader;
    19
    20  import org.apache.commons.jxpath.JXPathException;
    21  import org.apache.commons.jxpath.ri.parser.ParseException;
    22  import org.apache.commons.jxpath.ri.parser.TokenMgrError;
    23  import org.apache.commons.jxpath.ri.parser.XPathParser;
    24
    25  /***
    26   * XPath parser
    27   *
    28   * @author Dmitri Plotnikov
    29   * @version $Revision: 1.8 $ $Date: 2004/02/29 14:17:45 $
    30   */
    31  public class Parser {
    32
    33      private static XPathParser parser = new XPathParser(new StringReader(""));
    34
    35      /***
    36       * Parses the XPath expression. Throws a JXPathException in case
    37       * of a syntax error.
    38       */
    39      public static Object parseExpression(
    40          String expression,
    41          Compiler compiler)
    42      {
    43          synchronized (parser) {
    44              parser.setCompiler(compiler);
    45              Object expr = null;
    46              try {
    47                  parser.ReInit(new StringReader(expression));
    48                  expr = parser.parseExpression();
    49              }
    50              catch (TokenMgrError e) {
    51                  throw new JXPathException(
    52                      "Invalid XPath: '"
    53                          + addEscapes(expression)
    54                          + "'. Invalid symbol '"
    55                          + addEscapes(String.valueOf(e.getCharacter()))
    56                          + "' "
    57                          + describePosition(expression, e.getPosition()));
    58              }
    59              catch (ParseException e) {
    60                  throw new JXPathException(
    61                      "Invalid XPath: '"
    62                          + addEscapes(expression)
    63                          + "'. Syntax error "
    64                          + describePosition(
    65                              expression,
    66                              e.currentToken.beginColumn));
    67              }
    68              return expr;
    69          }
    70      }
    71
    72      private static String describePosition(String expression, int position) {
    73          if (position <= 0) {
    74              return "at the beginning of the expression";
    75          }
    76          else if (position >= expression.length()) {
    77              return "- expression incomplete";
    78          }
    79          else {
    80              return "after: '"
    81                  + addEscapes(expression.substring(0, position)) + "'";
    82          }
    83      }
    84
    85      private static String addEscapes(String string) {
    86          // Piggy-back on the code generated by JavaCC
    87          return TokenMgrError.addEscapes(string);
    88      }
    89  }