rowiteratorimpl.java

来自「jsr170接口的java实现。是个apache的开源项目。」· Java 代码 · 共 353 行

JAVA
353
字号
/* * 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.lucene;import org.apache.jackrabbit.core.NodeImpl;import org.apache.jackrabbit.core.PropertyImpl;import org.apache.jackrabbit.name.NameException;import org.apache.jackrabbit.name.NamespaceResolver;import org.apache.jackrabbit.name.QName;import org.apache.jackrabbit.name.NameFormat;import org.apache.jackrabbit.value.LongValue;import org.apache.jackrabbit.value.PathValue;import org.apache.jackrabbit.value.StringValue;import org.slf4j.LoggerFactory;import org.slf4j.Logger;import javax.jcr.ItemNotFoundException;import javax.jcr.Property;import javax.jcr.PropertyType;import javax.jcr.RepositoryException;import javax.jcr.Value;import javax.jcr.query.Row;import javax.jcr.query.RowIterator;import java.util.Arrays;import java.util.HashSet;import java.util.NoSuchElementException;import java.util.Set;import java.io.IOException;/** * Implements the {@link javax.jcr.query.RowIterator} interface returned by * a {@link javax.jcr.query.QueryResult}. */class RowIteratorImpl implements RowIterator {    /**     * The logger instance for this class.     */    private static final Logger log = LoggerFactory.getLogger(RowIteratorImpl.class);    /**     * Iterator over nodes, that constitute the result set.     */    private final ScoreNodeIterator nodes;    /**     * Array of select property names     */    private final QName[] properties;    /**     * The <code>NamespaceResolver</code> of the user <code>Session</code>.     */    private final NamespaceResolver resolver;    /**     * The excerpt provider.     */    private final ExcerptProvider excerptProvider;    /**     * Creates a new <code>RowIteratorImpl</code> that iterates over the result     * nodes.     *     * @param nodes      a <code>ScoreNodeIterator</code> that contains the nodes of     *                   the query result.     * @param properties <code>QName</code> of the select properties.     * @param resolver   <code>NamespaceResolver</code> of the user     *                   <code>Session</code>.     */    RowIteratorImpl(ScoreNodeIterator nodes, QName[] properties, NamespaceResolver resolver) {        this(nodes, properties, resolver, null);    }    /**     * Creates a new <code>RowIteratorImpl</code> that iterates over the result     * nodes.     *     * @param nodes      a <code>ScoreNodeIterator</code> that contains the     *                   nodes of the query result.     * @param properties <code>QName</code> of the select properties.     * @param resolver   <code>NamespaceResolver</code> of the user     *                   <code>Session</code>.     * @param exProvider the excerpt provider associated with the query result     *                   that created this row iterator.     */    RowIteratorImpl(ScoreNodeIterator nodes,                    QName[] properties,                    NamespaceResolver resolver,                    ExcerptProvider exProvider) {        this.nodes = nodes;        this.properties = properties;        this.resolver = resolver;        this.excerptProvider = exProvider;    }        /**     * Returns the next <code>Row</code> in the iteration.     *     * @return the next <code>Row</code> in the iteration.     * @throws NoSuchElementException if iteration has no more     *                                <code>Row</code>s.     */    public Row nextRow() throws NoSuchElementException {        return new RowImpl(nodes.getScore(), nodes.nextNodeImpl());    }    /**     * Skip a number of <code>Row</code>s in this iterator.     *     * @param skipNum the non-negative number of <code>Row</code>s to skip     * @throws NoSuchElementException if skipped past the last     *                                <code>Row</code> in this iterator.     */    public void skip(long skipNum) throws NoSuchElementException {        nodes.skip(skipNum);    }    /**     * Returns the number of <code>Row</code>s in this iterator.     *     * @return the number of <code>Row</code>s in this iterator.     */    public long getSize() {        return nodes.getSize();    }    /**     * Returns the current position within this iterator. The number     * returned is the 0-based index of the next <code>Row</code> in the iterator,     * i.e. the one that will be returned on the subsequent <code>next</code> call.     * <p/>     * Note that this method does not check if there is a next element,     * i.e. an empty iterator will always return 0.     *     * @return the current position withing this iterator.     */    public long getPosition() {        return nodes.getPosition();    }    /**     * @throws UnsupportedOperationException always.     */    public void remove() {        throw new UnsupportedOperationException("remove");    }    /**     * Returns <code>true</code> if the iteration has more <code>Row</code>s.     * (In other words, returns <code>true</code> if <code>next</code> would     * return an <code>Row</code> rather than throwing an exception.)     *     * @return <code>true</code> if the iterator has more elements.     */    public boolean hasNext() {        return nodes.hasNext();    }    /**     * Returns the next <code>Row</code> in the iteration.     *     * @return the next <code>Row</code> in the iteration.     * @throws NoSuchElementException if iteration has no more <code>Row</code>s.     */    public Object next() throws NoSuchElementException {        return nextRow();    }    //---------------------< class RowImpl >------------------------------------    /**     * Implements the {@link javax.jcr.query.Row} interface, which represents     * a row in the query result.     */    class RowImpl implements Row {        /**         * The score for this result row         */        private final float score;        /**         * The underlying <code>Node</code> of this result row.         */        private final NodeImpl node;        /**         * Cached value array for returned by {@link #getValues()}.         */        private Value[] values;        /**         * Set of select property <code>QName</code>s.         */        private Set propertySet;        /**         * Creates a new <code>RowImpl</code> instance based on <code>node</code>.         *         * @param score the score value for this result row         * @param node  the underlying <code>Node</code> for this <code>Row</code>.         */        RowImpl(float score, NodeImpl node) {            this.score = score;            this.node = node;        }        /**         * Returns an array of all the values in the same order as the property         * names (column names) returned by         * {@link javax.jcr.query.QueryResult#getColumnNames()}.         *         * @return a <code>Value</code> array.         * @throws RepositoryException if an error occurs while retrieving the         *                             values from the <code>Node</code>.         */        public Value[] getValues() throws RepositoryException {            if (values == null) {                Value[] tmp = new Value[properties.length];                for (int i = 0; i < properties.length; i++) {                    if (node.hasProperty(properties[i])) {                        PropertyImpl prop = node.getProperty(properties[i]);                        if (!prop.getDefinition().isMultiple()) {                            if (prop.getDefinition().getRequiredType() == PropertyType.UNDEFINED) {                                tmp[i] = new StringValue(prop.getString());                            } else {                                tmp[i] = prop.getValue();                            }                        } else {                            // mvp values cannot be returned                            tmp[i] = null;                        }                    } else {                        // property not set or jcr:path / jcr:score / jcr:highlight                        if (QName.JCR_PATH.equals(properties[i])) {                            tmp[i] = PathValue.valueOf(node.getPath());                        } else if (QName.JCR_SCORE.equals(properties[i])) {                            tmp[i] = new LongValue(Math.round(score * 1000f));                        } else if (isExcerptFunction(properties[i])) {                            tmp[i] = getExcerpt();                        } else {                            tmp[i] = null;                        }                    }                }                values = tmp;            }            // return a copy of the array            Value[] ret = new Value[values.length];            System.arraycopy(values, 0, ret, 0, values.length);            return ret;        }        /**         * Returns the value of the indicated  property in this <code>Row</code>.         * <p/>         * If <code>propertyName</code> is not among the column names of the         * query result table, an <code>ItemNotFoundException</code> is thrown.         *         * @return a <code>Value</code>         * @throws ItemNotFoundException if <code>propertyName</code> is not         *                               among the column names of the query result table.         * @throws RepositoryException   if <code>propertyName</code> is not a         *                               valid property name.         */        public Value getValue(String propertyName) throws ItemNotFoundException, RepositoryException {            if (propertySet == null) {                // create the set first                Set tmp = new HashSet();                tmp.addAll(Arrays.asList(properties));                propertySet = tmp;            }            try {                QName prop = NameFormat.parse(propertyName, resolver);                if (!propertySet.contains(prop)) {                    throw new ItemNotFoundException(propertyName);                }                if (node.hasProperty(prop)) {                    Property p = node.getProperty(prop);                    if (p.getDefinition().getRequiredType() == PropertyType.UNDEFINED) {                        return new StringValue(p.getString());                    } else {                        return p.getValue();                    }                } else {                    // either jcr:score, jcr:path or not set                    if (QName.JCR_PATH.equals(prop)) {                        return PathValue.valueOf(node.getPath());                    } else if (QName.JCR_SCORE.equals(prop)) {                        return new LongValue(Math.round(score * 1000f));                    } else if (isExcerptFunction(prop)) {                        return getExcerpt();                    } else {                        return null;                    }                }            } catch (NameException e) {                throw new RepositoryException(e.getMessage(), e);            }        }        /**         * @param name a QName.         * @return <code>true</code> if <code>name</code> is the rep:excerpt         *         function, <code>false</code> otherwise.         */        private boolean isExcerptFunction(QName name) {            return name.getNamespaceURI().equals(QName.NS_REP_URI) &&                    name.getLocalName().startsWith("excerpt(");        }        /**         * Returns an excerpt for the node associated with this row.         *         * @return a StringValue or <code>null</code> if the excerpt cannot be         *         created or an error occurs.         */        private Value getExcerpt() {            if (excerptProvider == null) {                return null;            }            try {                long time = System.currentTimeMillis();                String excerpt = excerptProvider.getExcerpt(node.getNodeId(), 3, 150);                time = System.currentTimeMillis() - time;                log.debug("Created excerpt in {} ms.", new Long(time));                if (excerpt != null) {                    return new StringValue(excerpt);                } else {                    return null;                }            } catch (IOException e) {                return null;            }        }    }}

⌨️ 快捷键说明

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