queryformat.java

来自「jsr170接口的java实现。是个apache的开源项目。」· Java 代码 · 共 496 行 · 第 1/2 页

JAVA
496
字号
/* * 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.ExactQueryNode;import org.apache.jackrabbit.core.query.LocationStepQueryNode;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.QueryNodeVisitor;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.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.util.ISO8601;import org.apache.jackrabbit.util.ISO9075;import javax.jcr.query.InvalidQueryException;import java.util.ArrayList;import java.util.Calendar;import java.util.List;import java.util.TimeZone;/** * Implements the query node tree serialization into a String. */class QueryFormat implements QueryNodeVisitor, QueryConstants {    /**     * Will be used to resolve QNames     */    private final NamespaceResolver resolver;    /**     * The String representation of the query node tree     */    private String statement;    /**     * List of exception objects created while creating the XPath string     */    private List exceptions = new ArrayList();    private QueryFormat(QueryRootNode root, NamespaceResolver resolver)            throws InvalidQueryException {        this.resolver = resolver;        statement = root.accept(this, new StringBuffer()).toString();        if (exceptions.size() > 0) {            Exception e = (Exception) exceptions.get(0);            throw new InvalidQueryException(e.getMessage(), e);        }    }    /**     * Creates a XPath <code>String</code> representation of the QueryNode tree     * argument <code>root</code>.     *     * @param root     the query node tree.     * @param resolver to resolve QNames.     * @return the XPath string representation of the QueryNode tree.     * @throws InvalidQueryException the query node tree cannot be represented     *                               as a XPath <code>String</code>.     */    public static String toString(QueryRootNode root, NamespaceResolver resolver)            throws InvalidQueryException {        return new QueryFormat(root, resolver).toString();    }    /**     * Returns the string representation.     *     * @return the string representation.     */    public String toString() {        return statement;    }    //-------------< QueryNodeVisitor interface >-------------------------------    public Object visit(QueryRootNode node, Object data) {        StringBuffer sb = (StringBuffer) data;        node.getLocationNode().accept(this, data);        if (node.getOrderNode() != null) {            node.getOrderNode().accept(this, data);        }        QName[] selectProps = node.getSelectProperties();        if (selectProps.length > 0) {            sb.append('/');            boolean union = selectProps.length > 1;            if (union) {                sb.append('(');            }            String pipe = "";            for (int i = 0; i < selectProps.length; i++) {                try {                    sb.append(pipe);                    sb.append('@');                    NameFormat.format(ISO9075.encode(selectProps[i]), resolver, sb);                    pipe = "|";                } catch (NoPrefixDeclaredException e) {                    exceptions.add(e);                }            }            if (union) {                sb.append(')');            }        }        return data;    }    public Object visit(OrQueryNode node, Object data) {        StringBuffer sb = (StringBuffer) data;        boolean bracket = false;        if (node.getParent() instanceof AndQueryNode) {            bracket = true;        }        if (bracket) {            sb.append("(");        }        String or = "";        QueryNode[] operands = node.getOperands();        for (int i = 0; i < operands.length; i++) {            sb.append(or);            operands[i].accept(this, sb);            or = " or ";        }        if (bracket) {            sb.append(")");        }        return sb;    }    public Object visit(AndQueryNode node, Object data) {        StringBuffer sb = (StringBuffer) data;        String and = "";        QueryNode[] operands = node.getOperands();        for (int i = 0; i < operands.length; i++) {            sb.append(and);            operands[i].accept(this, sb);            and = " and ";        }        return sb;    }    public Object visit(NotQueryNode node, Object data) {        StringBuffer sb = (StringBuffer) data;        QueryNode[] operands = node.getOperands();        if (operands.length > 0) {            try {                NameFormat.format(XPathQueryBuilder.FN_NOT_10, resolver, sb);                sb.append("(");                operands[0].accept(this, sb);                sb.append(")");            } catch (NoPrefixDeclaredException e) {                exceptions.add(e);            }        }        return sb;    }    public Object visit(ExactQueryNode node, Object data) {        StringBuffer sb = (StringBuffer) data;        sb.append("@");        try {            NameFormat.format(ISO9075.encode(node.getPropertyName()), resolver, sb);            sb.append("='");            NameFormat.format(node.getValue(), resolver, sb);        } catch (NoPrefixDeclaredException e) {            exceptions.add(e);        }        sb.append("'");        return sb;    }    public Object visit(NodeTypeQueryNode node, Object data) {        // handled in location step visit        return data;    }    public Object visit(TextsearchQueryNode node, Object data) {        StringBuffer sb = (StringBuffer) data;        try {            NameFormat.format(XPathQueryBuilder.JCR_CONTAINS, resolver, sb);            sb.append("(");            Path relPath = node.getRelativePath();            if (relPath == null) {                sb.append(".");            } else {                Path.PathElement[] elements = relPath.getElements();                String slash = "";                for (int i = 0; i < elements.length; i++) {                    sb.append(slash);                    slash = "/";                    if (node.getReferencesProperty() && i == elements.length - 1) {                        sb.append("@");                    }                    if (elements[i].getName().equals(RelationQueryNode.STAR_NAME_TEST)) {                        sb.append("*");                    } else {                        NameFormat.format(ISO9075.encode(elements[i].getName()), resolver, sb);                    }                    if (elements[i].getIndex() != 0) {                        sb.append("[").append(elements[i].getIndex()).append("]");                    }                }            }            sb.append(", '");            sb.append(node.getQuery().replaceAll("'", "''"));            sb.append("')");        } catch (NoPrefixDeclaredException e) {            exceptions.add(e);        }        return sb;    }    public Object visit(PathQueryNode node, Object data) {        StringBuffer sb = (StringBuffer) data;        if (node.isAbsolute()) {            sb.append("/");        }        LocationStepQueryNode[] steps = node.getPathSteps();        String slash = "";

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?