19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one
39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file
49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information
59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file
69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the  "License");
79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License.
89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at
99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software
139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and
169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License.
179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * $Id: Lexer.java 524810 2007-04-02 15:51:55Z zongaro $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xpath.compiler;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Vector;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.PrefixResolver;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.res.XPATHErrorResources;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class is in charge of lexical processing of the XPath
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * expression into tokens.
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonclass Lexer
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The target XPath.
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private Compiler m_compiler;
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The prefix resolver to map prefixes to namespaces in the XPath.
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  PrefixResolver m_namespaceContext;
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The XPath processor object.
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  XPathParser m_processor;
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This value is added to each element name in the TARGETEXTRA
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * that is a 'target' (right-most top-level element name).
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  static final int TARGETEXTRA = 10000;
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Ignore this, it is going away.
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This holds a map to the m_tokenQueue that tells where the top-level elements are.
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * It is used for pattern matching so the m_tokenQueue can be walked backwards.
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Each element that is a 'target', (right-most top level element name) has
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * TARGETEXTRA added to it.
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private int m_patternMap[] = new int[100];
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Ignore this, it is going away.
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The number of elements that m_patternMap maps;
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private int m_patternMapSize;
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create a Lexer object.
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param compiler The owning compiler for this lexer.
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param resolver The prefix resolver for mapping qualified name prefixes
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                 to namespace URIs.
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param xpathProcessor The parser that is processing strings to opcodes.
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  Lexer(Compiler compiler, PrefixResolver resolver,
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XPathParser xpathProcessor)
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_compiler = compiler;
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_namespaceContext = resolver;
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_processor = xpathProcessor;
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Walk through the expression and build a token queue, and a map of the top-level
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * elements.
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param pat XSLT Expression.
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void tokenize(String pat) throws javax.xml.transform.TransformerException
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    tokenize(pat, null);
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Walk through the expression and build a token queue, and a map of the top-level
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * elements.
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param pat XSLT Expression.
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param targetStrings Vector to hold Strings, may be null.
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void tokenize(String pat, Vector targetStrings)
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          throws javax.xml.transform.TransformerException
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_compiler.m_currentPattern = pat;
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_patternMapSize = 0;
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // This needs to grow too.  Use a conservative estimate that the OpMapVector
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // needs about five time the length of the input path expression - to a
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // maximum of MAXTOKENQUEUESIZE*5.  If the OpMapVector needs to grow, grow
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // it freely (second argument to constructor).
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int initTokQueueSize = ((pat.length() < OpMap.MAXTOKENQUEUESIZE)
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                 ? pat.length() :  OpMap.MAXTOKENQUEUESIZE) * 5;
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_compiler.m_opMap = new OpMapVector(initTokQueueSize,
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                         OpMap.BLOCKTOKENQUEUESIZE * 5,
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                         OpMap.MAPINDEX_LENGTH);
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int nChars = pat.length();
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int startSubstring = -1;
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int posOfNSSep = -1;
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    boolean isStartOfPat = true;
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    boolean isAttrName = false;
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    boolean isNum = false;
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Nesting of '[' so we can know if the given element should be
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // counted inside the m_patternMap.
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int nesting = 0;
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // char[] chars = pat.toCharArray();
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    for (int i = 0; i < nChars; i++)
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      char c = pat.charAt(i);
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      switch (c)
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case '\"' :
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (startSubstring != -1)
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          isNum = false;
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          isAttrName = false;
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (-1 != posOfNSSep)
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            posOfNSSep = mapNSTokens(pat, startSubstring, posOfNSSep, i);
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          else
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            addToTokenQueue(pat.substring(startSubstring, i));
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        startSubstring = i;
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        for (i++; (i < nChars) && ((c = pat.charAt(i)) != '\"'); i++);
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (c == '\"' && i < nChars)
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          addToTokenQueue(pat.substring(startSubstring, i + 1));
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          startSubstring = -1;
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_processor.error(XPATHErrorResources.ER_EXPECTED_DOUBLE_QUOTE,
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            null);  //"misquoted literal... expected double quote!");
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case '\'' :
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (startSubstring != -1)
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          isNum = false;
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          isAttrName = false;
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (-1 != posOfNSSep)
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            posOfNSSep = mapNSTokens(pat, startSubstring, posOfNSSep, i);
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          else
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            addToTokenQueue(pat.substring(startSubstring, i));
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        startSubstring = i;
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        for (i++; (i < nChars) && ((c = pat.charAt(i)) != '\''); i++);
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (c == '\'' && i < nChars)
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          addToTokenQueue(pat.substring(startSubstring, i + 1));
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          startSubstring = -1;
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          m_processor.error(XPATHErrorResources.ER_EXPECTED_SINGLE_QUOTE,
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            null);  //"misquoted literal... expected single quote!");
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case 0x0A :
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case 0x0D :
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case ' ' :
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case '\t' :
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (startSubstring != -1)
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          isNum = false;
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          isAttrName = false;
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (-1 != posOfNSSep)
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            posOfNSSep = mapNSTokens(pat, startSubstring, posOfNSSep, i);
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          else
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            addToTokenQueue(pat.substring(startSubstring, i));
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          startSubstring = -1;
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case '@' :
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        isAttrName = true;
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // fall-through on purpose
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case '-' :
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if ('-' == c)
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (!(isNum || (startSubstring == -1)))
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            break;
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          isNum = false;
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // fall-through on purpose
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case '(' :
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case '[' :
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case ')' :
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case ']' :
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case '|' :
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case '/' :
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case '*' :
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case '+' :
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case '=' :
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case ',' :
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case '\\' :  // Unused at the moment
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case '^' :  // Unused at the moment
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case '!' :  // Unused at the moment
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case '$' :
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case '<' :
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case '>' :
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (startSubstring != -1)
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          isNum = false;
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          isAttrName = false;
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (-1 != posOfNSSep)
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            posOfNSSep = mapNSTokens(pat, startSubstring, posOfNSSep, i);
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          else
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            addToTokenQueue(pat.substring(startSubstring, i));
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          startSubstring = -1;
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if (('/' == c) && isStartOfPat)
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if ('*' == c)
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          isAttrName = false;
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (0 == nesting)
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if ('|' == c)
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (null != targetStrings)
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              recordTokenString(targetStrings);
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            isStartOfPat = true;
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if ((')' == c) || (']' == c))
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          nesting--;
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if (('(' == c) || ('[' == c))
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          nesting++;
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        addToTokenQueue(pat.substring(i, i + 1));
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case ':' :
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (i>0)
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (posOfNSSep == (i - 1))
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (startSubstring != -1)
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              if (startSubstring < (i - 1))
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                addToTokenQueue(pat.substring(startSubstring, i - 1));
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            isNum = false;
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            isAttrName = false;
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            startSubstring = -1;
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            posOfNSSep = -1;
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            addToTokenQueue(pat.substring(i - 1, i + 1));
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            break;
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          else
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            posOfNSSep = i;
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // fall through on purpose
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      default :
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (-1 == startSubstring)
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          startSubstring = i;
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          isNum = Character.isDigit(c);
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if (isNum)
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          isNum = Character.isDigit(c);
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (startSubstring != -1)
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      isNum = false;
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      isStartOfPat = mapPatternElemPos(nesting, isStartOfPat, isAttrName);
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if ((-1 != posOfNSSep) ||
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         ((m_namespaceContext != null) && (m_namespaceContext.handlesNullPrefixes())))
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        posOfNSSep = mapNSTokens(pat, startSubstring, posOfNSSep, nChars);
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        addToTokenQueue(pat.substring(startSubstring, nChars));
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 == m_compiler.getTokenQueueSize())
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_processor.error(XPATHErrorResources.ER_EMPTY_EXPRESSION, null);  //"Empty expression!");
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (null != targetStrings)
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      recordTokenString(targetStrings);
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_processor.m_queueMark = 0;
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Record the current position on the token queue as long as
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * this is a top-level element.  Must be called before the
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * next token is added to the m_tokenQueue.
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nesting The nesting count for the pattern element.
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param isStart true if this is the start of a pattern.
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param isAttrName true if we have determined that this is an attribute name.
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if this is the start of a pattern.
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private boolean mapPatternElemPos(int nesting, boolean isStart,
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                    boolean isAttrName)
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (0 == nesting)
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(m_patternMapSize >= m_patternMap.length)
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int patternMap[] = m_patternMap;
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int len = m_patternMap.length;
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_patternMap = new int[m_patternMapSize + 100];
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        System.arraycopy(patternMap, 0, m_patternMap, 0, len);
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (!isStart)
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        m_patternMap[m_patternMapSize - 1] -= TARGETEXTRA;
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_patternMap[m_patternMapSize] =
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        (m_compiler.getTokenQueueSize() - (isAttrName ? 1 : 0)) + TARGETEXTRA;
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_patternMapSize++;
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      isStart = false;
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return isStart;
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a map pos, return the corresponding token queue pos.
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param i The index in the m_patternMap.
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return the token queue position.
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private int getTokenQueuePosFromMap(int i)
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int pos = m_patternMap[i];
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return (pos >= TARGETEXTRA) ? (pos - TARGETEXTRA) : pos;
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Reset token queue mark and m_token to a
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * given position.
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param mark The new position.
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private final void resetTokenMark(int mark)
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int qsz = m_compiler.getTokenQueueSize();
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_processor.m_queueMark = (mark > 0)
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                              ? ((mark <= qsz) ? mark - 1 : mark) : 0;
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_processor.m_queueMark < qsz)
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_processor.m_token =
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        (String) m_compiler.getTokenQueue().elementAt(m_processor.m_queueMark++);
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_processor.m_tokenChar = m_processor.m_token.charAt(0);
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_processor.m_token = null;
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_processor.m_tokenChar = 0;
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Given a string, return the corresponding keyword token.
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param key The keyword.
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return An opcode value.
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  final int getKeywordToken(String key)
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int tok;
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      Integer itok = (Integer) Keywords.getKeyWord(key);
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      tok = (null != itok) ? itok.intValue() : 0;
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (NullPointerException npe)
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      tok = 0;
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (ClassCastException cce)
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      tok = 0;
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return tok;
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Record the current token in the passed vector.
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param targetStrings Vector of string.
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private void recordTokenString(Vector targetStrings)
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int tokPos = getTokenQueuePosFromMap(m_patternMapSize - 1);
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    resetTokenMark(tokPos + 1);
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (m_processor.lookahead('(', 1))
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      int tok = getKeywordToken(m_processor.m_token);
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      switch (tok)
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case OpCodes.NODETYPE_COMMENT :
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        targetStrings.addElement(PsuedoNames.PSEUDONAME_COMMENT);
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case OpCodes.NODETYPE_TEXT :
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        targetStrings.addElement(PsuedoNames.PSEUDONAME_TEXT);
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case OpCodes.NODETYPE_NODE :
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        targetStrings.addElement(PsuedoNames.PSEUDONAME_ANY);
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case OpCodes.NODETYPE_ROOT :
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        targetStrings.addElement(PsuedoNames.PSEUDONAME_ROOT);
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case OpCodes.NODETYPE_ANYELEMENT :
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        targetStrings.addElement(PsuedoNames.PSEUDONAME_ANY);
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      case OpCodes.NODETYPE_PI :
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        targetStrings.addElement(PsuedoNames.PSEUDONAME_ANY);
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        break;
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      default :
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        targetStrings.addElement(PsuedoNames.PSEUDONAME_ANY);
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (m_processor.tokenIs('@'))
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        tokPos++;
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        resetTokenMark(tokPos + 1);
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (m_processor.lookahead(':', 1))
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        tokPos += 2;
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      targetStrings.addElement(m_compiler.getTokenQueue().elementAt(tokPos));
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Add a token to the token queue.
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param s The token.
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private final void addToTokenQueue(String s)
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_compiler.getTokenQueue().addElement(s);
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * When a seperator token is found, see if there's a element name or
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * the like to map.
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param pat The XPath name string.
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param startSubstring The start of the name string.
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param posOfNSSep The position of the namespace seperator (':').
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param posOfScan The end of the name index.
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws javax.xml.transform.TransformerException
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return -1 always.
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  private int mapNSTokens(String pat, int startSubstring, int posOfNSSep,
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                          int posOfScan)
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson           throws javax.xml.transform.TransformerException
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson {
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String prefix = "";
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if ((startSubstring >= 0) && (posOfNSSep >= 0))
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson       prefix = pat.substring(startSubstring, posOfNSSep);
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String uName;
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if ((null != m_namespaceContext) &&!prefix.equals("*")
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            &&!prefix.equals("xmlns"))
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      try
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (prefix.length() > 0)
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          uName = ((PrefixResolver) m_namespaceContext).getNamespaceForPrefix(
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            prefix);
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // Assume last was wildcard. This is not legal according
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // to the draft. Set the below to true to make namespace
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // wildcards work.
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if (false)
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            addToTokenQueue(":");
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String s = pat.substring(posOfNSSep + 1, posOfScan);
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (s.length() > 0)
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              addToTokenQueue(s);
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return -1;
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          else
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            uName =
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              ((PrefixResolver) m_namespaceContext).getNamespaceForPrefix(
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                prefix);
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      catch (ClassCastException cce)
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        uName = m_namespaceContext.getNamespaceForPrefix(prefix);
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      uName = prefix;
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if ((null != uName) && (uName.length() > 0))
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      addToTokenQueue(uName);
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      addToTokenQueue(":");
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String s = pat.substring(posOfNSSep + 1, posOfScan);
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (s.length() > 0)
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        addToTokenQueue(s);
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // To older XPath code it doesn't matter if
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // error() is called or errorForDOM3().
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		m_processor.errorForDOM3(XPATHErrorResources.ER_PREFIX_MUST_RESOLVE,
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson						 new String[] {prefix});  //"Prefix must resolve to a namespace: {0}";
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/** old code commented out 17-Sep-2004
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// error("Could not locate namespace for prefix: "+prefix);
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//		  m_processor.error(XPATHErrorResources.ER_PREFIX_MUST_RESOLVE,
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//					 new String[] {prefix});  //"Prefix must resolve to a namespace: {0}";
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson*/
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      /***  Old code commented out 10-Jan-2001
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      addToTokenQueue(prefix);
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      addToTokenQueue(":");
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String s = pat.substring(posOfNSSep + 1, posOfScan);
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (s.length() > 0)
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        addToTokenQueue(s);
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      ***/
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return -1;
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
670