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 + -
显示快捷键?