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