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