workspacetraversalresult.java

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

JAVA
291
字号
/* * 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.commons.collections.iterators.IteratorChain;import org.apache.jackrabbit.core.NodeImpl;import org.apache.jackrabbit.name.QName;import org.apache.jackrabbit.name.NamespaceResolver;import org.apache.jackrabbit.name.NoPrefixDeclaredException;import org.apache.jackrabbit.name.NameFormat;import javax.jcr.query.QueryResult;import javax.jcr.query.RowIterator;import javax.jcr.RepositoryException;import javax.jcr.NodeIterator;import javax.jcr.Session;import javax.jcr.Node;import java.util.Iterator;import java.util.Arrays;import java.util.ArrayList;import java.util.List;import java.util.NoSuchElementException;/** * Implements a query result that traverses the whole workspace and returns * the nodes in document order. */public class WorkspaceTraversalResult implements QueryResult {    /**     * The session that issued the query.     */    private final Session session;    /**     * The select properties.     */    private final QName[] properties;    /**     * The namespace resolver of the session.     */    private final NamespaceResolver resolver;    /**     * Creates a new <code>WorkspaceTraversalResult</code>.     *     * @param session    the session that issued the query.     * @param properties the select properties.     * @param resolver   the namespace resolver of the session.     */    public WorkspaceTraversalResult(Session session,                             QName[] properties,                             NamespaceResolver resolver) {        this.session = session;        this.properties = properties;        this.resolver = resolver;    }    /**     * @inheritDoc     */    public String[] getColumnNames() throws RepositoryException {        try {            String[] propNames = new String[properties.length];            for (int i = 0; i < properties.length; i++) {                propNames[i] = NameFormat.format(properties[i], resolver);            }            return propNames;        } catch (NoPrefixDeclaredException npde) {            String msg = "encountered invalid property name";            throw new RepositoryException(msg, npde);        }    }    /**     * @inheritDoc     */    public RowIterator getRows() throws RepositoryException {        return new RowIteratorImpl(getNodeIterator(), properties, resolver);    }    /**     * @inheritDoc     */    public NodeIterator getNodes() throws RepositoryException {        return getNodeIterator();    }    /**     * Returns a {@link ScoreNodeIterator} that traverses the workspace in     * document order.     *     * @return iterator that returns nodes in document order.     * @throws RepositoryException if an error occurs while creating the     *                             iterator.     */    private ScoreNodeIterator getNodeIterator() throws RepositoryException {        return new TraversingNodeIterator(session.getRootNode(), Offset.ZERO);    }    /**     * Implements a node iterator that traverses the workspace in document     * order.     */    private class TraversingNodeIterator implements ScoreNodeIterator, Offset {        /**         * The current <code>Node</code>, which acts as the starting point for         * the traversal.         */        private final Node currentNode;        /**         * The chain of iterators which includes the iterators of the children         * of the current node.         */        private IteratorChain selfAndChildren;        /**         * Offset of this iterator to calculate the value in         * {@link #getPosition()}.         */        private final Offset offset;        /**         * Current (local) position in this iterator.         */        private long position;        /**         * Creates a <code>TraversingNodeIterator</code>.         * @param start the node from where to start the traversal.         * @param offset the offset to use to calculate the position.         */        TraversingNodeIterator(Node start, Offset offset) {            currentNode = start;            this.offset = offset;        }        /**         * Returns always 1.         * @return always 1.         */        public float getScore() {            return 1.0f;        }        /**         * @inheritDoc         */        public NodeImpl nextNodeImpl() {            init();            NodeImpl n = (NodeImpl) selfAndChildren.next();            position++;            return n;        }        /**         * @inheritDoc         */        public Node nextNode() {            return nextNodeImpl();        }        /**         * @inheritDoc         */        public void skip(long skipNum) {            while (skipNum > 0) {                if (hasNext()) {                    next();                    skipNum--;                } else {                    throw new NoSuchElementException();                }            }        }        /**         * Returns always -1 (unknown).         * @return always -1.         */        public long getSize() {            return -1;        }        /**         * @inheritDoc         */        public long getPosition() {            return offset.getValue() + position;        }        /**         * @exception UnsupportedOperationException always.         */        public void remove() {            throw new UnsupportedOperationException("remove");        }        /**         * @inheritDoc         */        public boolean hasNext() {            init();            return selfAndChildren.hasNext();        }        /**         * @inheritDoc         */        public Object next() {            return nextNode();        }        /**         * Returns the offset value for this iterator. The offset is the current         * position plus 1.         * @return  the offset value for this iterator.         */        public long getValue() {            return getPosition() + 1;        }        /**         * Initializes the iterator chain once.         */        private void init() {            if (selfAndChildren == null) {                Iterator current = Arrays.asList(new Node[]{currentNode}).iterator();                List allIterators = new ArrayList();                allIterators.add(current);                Offset offset = new Offset() {                    public long getValue() {                        return TraversingNodeIterator.this.offset.getValue() + 1;                    }                };                // create new TraversingNodeIterator for each child                try {                    NodeIterator children = currentNode.getNodes();                    while (children.hasNext()) {                        offset = new TraversingNodeIterator(children.nextNode(), offset);                        allIterators.add(offset);                    }                } catch (RepositoryException e) {                    // currentNode is probably stale                }                selfAndChildren = new IteratorChain(allIterators);            }        }    }    /**     * Helper class that holds an offset value.     */    interface Offset {        /**         * Offset that always returns the value 0.         */        Offset ZERO = new Offset() {            public long getValue() {                return 0;            }        };        /**         * Returns the value of this offset.         * @return the value of this offset..         */        long getValue();    }}

⌨️ 快捷键说明

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