xpathquerybuilder.java
来自「jsr170接口的java实现。是个apache的开源项目。」· Java 代码 · 共 1,077 行 · 第 1/4 页
JAVA
1,077 行
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.jackrabbit.core.query.xpath;import org.apache.jackrabbit.core.query.AndQueryNode;import org.apache.jackrabbit.core.query.DerefQueryNode;import org.apache.jackrabbit.core.query.LocationStepQueryNode;import org.apache.jackrabbit.core.query.NAryQueryNode;import org.apache.jackrabbit.core.query.NodeTypeQueryNode;import org.apache.jackrabbit.core.query.NotQueryNode;import org.apache.jackrabbit.core.query.OrQueryNode;import org.apache.jackrabbit.core.query.OrderQueryNode;import org.apache.jackrabbit.core.query.PathQueryNode;import org.apache.jackrabbit.core.query.QueryConstants;import org.apache.jackrabbit.core.query.QueryNode;import org.apache.jackrabbit.core.query.QueryRootNode;import org.apache.jackrabbit.core.query.RelationQueryNode;import org.apache.jackrabbit.core.query.TextsearchQueryNode;import org.apache.jackrabbit.core.query.PropertyFunctionQueryNode;import org.apache.jackrabbit.core.query.DefaultQueryNodeVisitor;import org.apache.jackrabbit.name.NameException;import org.apache.jackrabbit.name.NamespaceResolver;import org.apache.jackrabbit.name.NoPrefixDeclaredException;import org.apache.jackrabbit.name.QName;import org.apache.jackrabbit.name.NameFormat;import org.apache.jackrabbit.name.Path;import org.apache.jackrabbit.name.MalformedPathException;import org.apache.jackrabbit.util.ISO8601;import org.apache.jackrabbit.util.ISO9075;import org.apache.commons.collections.map.ReferenceMap;import javax.jcr.query.InvalidQueryException;import java.io.StringReader;import java.util.ArrayList;import java.util.Calendar;import java.util.List;import java.util.Map;/** * Query builder that translates a XPath statement into a query tree structure. */public class XPathQueryBuilder implements XPathVisitor, XPathTreeConstants { /** * Namespace uri for xpath functions. See also class SearchManager */ static final String NS_FN_URI = "http://www.w3.org/2005/xpath-functions"; /** * QName for 'fn:not' */ static final QName FN_NOT = new QName(NS_FN_URI, "not"); /** * QName for 'fn:lower-case' */ static final QName FN_LOWER_CASE = new QName(NS_FN_URI, "lower-case"); /** * QName for 'fn:upper-case' */ static final QName FN_UPPER_CASE = new QName(NS_FN_URI, "upper-case"); /** * QName for 'not' as defined in XPath 1.0 (no prefix) */ static final QName FN_NOT_10 = new QName("", "not"); /** * QName for true function. */ static final QName FN_TRUE = new QName("", "true"); /** * QName for false function. */ static final QName FN_FALSE = new QName("", "false"); /** * QName for position function. */ static final QName FN_POSITION = new QName("", "position"); /** * QName for element function. */ static final QName FN_ELEMENT = new QName("", "element"); /** * QName for the full position function including bracket */ static final QName FN_POSITION_FULL = new QName("", "position()"); /** * QName for jcr:xmltext */ static final QName JCR_XMLTEXT = new QName(QName.NS_JCR_URI, "xmltext"); /** * QName for last function. */ static final QName FN_LAST = new QName("", "last"); /** * QName for first function. */ static final QName FN_FIRST = new QName("", "first"); /** * QName for xs:dateTime */ static final QName XS_DATETIME = new QName("http://www.w3.org/2001/XMLSchema", "dateTime"); /** * QName for jcr:like */ static final QName JCR_LIKE = new QName(QName.NS_JCR_URI, "like"); /** * QName for jcr:deref */ static final QName JCR_DEREF = new QName(QName.NS_JCR_URI, "deref"); /** * QName for jcr:contains */ static final QName JCR_CONTAINS = new QName(QName.NS_JCR_URI, "contains"); /** * QName for jcr:root */ static final QName JCR_ROOT = new QName(QName.NS_JCR_URI, "root"); /** * QName for jcr:score */ static final QName JCR_SCORE = new QName(QName.NS_JCR_URI, "score"); /** * String constant for operator 'eq' */ private static final String OP_EQ = "eq"; /** * String constant for operator 'ne' */ private static final String OP_NE = "ne"; /** * String constant for operator 'gt' */ private static final String OP_GT = "gt"; /** * String constant for operator 'ge' */ private static final String OP_GE = "ge"; /** * String constant for operator 'lt' */ private static final String OP_LT = "lt"; /** * String constant for operator 'le' */ private static final String OP_LE = "le"; /** * String constant for operator '=' */ private static final String OP_SIGN_EQ = "="; /** * String constant for operator '!=' */ private static final String OP_SIGN_NE = "!="; /** * String constant for operator '>' */ private static final String OP_SIGN_GT = ">"; /** * String constant for operator '>=' */ private static final String OP_SIGN_GE = ">="; /** * String constant for operator '<' */ private static final String OP_SIGN_LT = "<"; /** * String constant for operator '<=' */ private static final String OP_SIGN_LE = "<="; /** * Map of reusable XPath parser instances indexed by NamespaceResolver. */ private static final Map parsers = new ReferenceMap(ReferenceMap.WEAK, ReferenceMap.WEAK); /** * The root <code>QueryNode</code> */ private final QueryRootNode root = new QueryRootNode(); /** * The {@link NamespaceResolver} in use */ private final NamespaceResolver resolver; /** * List of exceptions that are created while building the query tree */ private final List exceptions = new ArrayList(); /** * Temporary relative path */ private Path.PathBuilder tmpRelPath; /** * Creates a new <code>XPathQueryBuilder</code> instance. * * @param statement the XPath statement. * @param resolver the namespace resolver to use. * @throws InvalidQueryException if the XPath statement is malformed. */ private XPathQueryBuilder(String statement, NamespaceResolver resolver) throws InvalidQueryException { this.resolver = resolver; try { // create an XQuery statement because we're actually using an // XQuery parser. statement = "for $v in " + statement + " return $v"; // get parser XPath parser; synchronized (parsers) { parser = (XPath) parsers.get(resolver); if (parser == null) { parser = new XPath(new StringReader(statement)); parsers.put(resolver, parser); } } SimpleNode query; // guard against concurrent use within same session synchronized (parser) { parser.ReInit(new StringReader(statement)); query = parser.XPath2(); } query.jjtAccept(this, root); } catch (ParseException e) { throw new InvalidQueryException(e.getMessage(), e);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?