⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyindex.java

📁 java1.6众多例子参考
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
/* * Copyright 2001-2006 The Apache Software Foundation. * * Licensed 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. *//* * $Id: KeyIndex.java,v 1.6 2006/06/19 19:49:02 spericas Exp $ */package com.sun.org.apache.xalan.internal.xsltc.dom;import java.util.StringTokenizer;import com.sun.org.apache.xalan.internal.xsltc.DOM;import com.sun.org.apache.xalan.internal.xsltc.DOMEnhancedForDTM;import com.sun.org.apache.xalan.internal.xsltc.runtime.BasisLibrary;import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;import com.sun.org.apache.xalan.internal.xsltc.util.IntegerArray;import com.sun.org.apache.xml.internal.dtm.Axis;import com.sun.org.apache.xml.internal.dtm.DTM;import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;import com.sun.org.apache.xml.internal.dtm.ref.DTMAxisIteratorBase;/** * Stores mappings of key values or IDs to DTM nodes. * <em>Use of an instance of this class as a {@link DTMAxisIterator} is * <b>deprecated.</b></em> * @author Morten Jorgensen * @author Santiago Pericas-Geertsen */public class KeyIndex extends DTMAxisIteratorBase {    /**     * A mapping between values and nodesets for the current document.  Used     * only while building keys.     */    private Hashtable _index;    /**     * The document node currently being processed.  Used only while building     * keys.     */    private int _currentDocumentNode = DTM.NULL;    /**     * A mapping from a document node to the mapping between values and nodesets     */    private Hashtable _rootToIndexMap = new Hashtable();    /**     * The node set associated to the current value passed     * to lookupKey();     */    private IntegerArray _nodes = null;    /**     * The XSLTC DOM object if this KeyIndex is being used to implement the     * id() function.     */    private DOM        _dom;        private DOMEnhancedForDTM    _enhancedDOM;    /**     * Store position after call to setMark()     */    private int _markedPosition = 0;    public KeyIndex(int dummy) {    }    public void setRestartable(boolean flag) {    }    /**     * Adds a node to the node list for a given value. Nodes will     * always be added in document order.     */    public void add(Object value, int node, int rootNode) {        if (_currentDocumentNode != rootNode) {            _currentDocumentNode = rootNode;            _index = new Hashtable();            _rootToIndexMap.put(new Integer(rootNode), _index);        }        IntegerArray nodes = (IntegerArray) _index.get(value);        if (nodes == null) {             nodes = new IntegerArray();            _index.put(value, nodes);            nodes.add(node);        // Because nodes are added in document order,        // duplicates can be eliminated easily at this stage.        } else if (node != nodes.at(nodes.cardinality() - 1)) {            nodes.add(node);        }    }    /**     * Merge the current value's nodeset set by lookupKey() with _nodes.     * @deprecated     */    public void merge(KeyIndex other) {	if (other == null) return;	if (other._nodes != null) {	    if (_nodes == null) {		_nodes = (IntegerArray)other._nodes.clone();	    }	    else {		_nodes.merge(other._nodes);	    }	}    }    /**     * This method must be called by the code generated by the id() function     * prior to returning the node iterator. The lookup code for key() and     * id() differ in the way the lookup value can be whitespace separated     * list of tokens for the id() function, but a single string for the     * key() function.     * @deprecated     */    public void lookupId(Object value) {	// Clear _nodes array	_nodes = null;	final StringTokenizer values = new StringTokenizer((String) value,                                                           " \n\t");	while (values.hasMoreElements()) {            final String token = (String) values.nextElement();	    IntegerArray nodes = (IntegerArray) _index.get(token);            if (nodes == null && _enhancedDOM != null                && _enhancedDOM.hasDOMSource()) {                nodes = getDOMNodeById(token);            }	    if (nodes == null) continue;	    if (_nodes == null) {		 nodes = (IntegerArray)nodes.clone();		_nodes = nodes;	    }	    else {		_nodes.merge(nodes);	    }	}    }    /**     * Return an IntegerArray for the DOM Node which has the given id.     *      * @param id The id     * @return A IntegerArray representing the Node whose id is the given value.     */    public IntegerArray getDOMNodeById(String id) {        IntegerArray nodes = null;        if (_enhancedDOM != null) {            int ident = _enhancedDOM.getElementById(id);            if (ident != DTM.NULL) {                Integer root = new Integer(_enhancedDOM.getDocument());                Hashtable index = (Hashtable) _rootToIndexMap.get(root);                if (index == null) {                    index = new Hashtable();                    _rootToIndexMap.put(root, index);                } else {                    nodes = (IntegerArray) index.get(id);                }                if (nodes == null) {                    nodes = new IntegerArray();                    index.put(id, nodes);                }                nodes.add(_enhancedDOM.getNodeHandle(ident));            }        }        return nodes;    }        /**     * <p>This method must be called by the code generated by the key() function     * prior to returning the node iterator.</p>     * <p><em>Use of an instance of this class as a {@link DTMAxisIterator} is     * <b>deprecated.</b></em></p>     * @deprecated     */    public void lookupKey(Object value) {        IntegerArray nodes = (IntegerArray) _index.get(value);        _nodes = (nodes != null) ? (IntegerArray) nodes.clone() : null;        _position = 0;    }    /**      * <p>Callers should not call next() after it returns END.</p>     * <p><em>Use of an instance of this class as a {@link DTMAxisIterator} is     * <b>deprecated.</b></em></p>     * @deprecated     */    public int next() {	if (_nodes == null) return DTMAxisIterator.END;	return (_position < _nodes.cardinality()) ? 	    _dom.getNodeHandle(_nodes.at(_position++)) : DTMAxisIterator.END;    }    /**     * Given a context node and the argument to the XPath <code>id</code>     * function, checks whether the context node is in the set of nodes that     * results from that reference to the <code>id</code> function.  This is     * used in the implementation of <code>id</code> patterns.     *     * @param node The context node     * @param value The argument to the <code>id</code> function     * @return <code>1</code> if the context node is in the set of nodes     *         returned by the reference to the <code>id</code> function;     *         <code>0</code>, otherwise     */    public int containsID(int node, Object value) {        final String string = (String)value;        int rootHandle = _dom.getAxisIterator(Axis.ROOT)                                 .setStartNode(node).next();        // Get the mapping table for the document containing the context node        Hashtable index =            (Hashtable) _rootToIndexMap.get(new Integer(rootHandle));        // Split argument to id function into XML whitespace separated tokens        final StringTokenizer values = new StringTokenizer(string, " \n\t");        while (values.hasMoreElements()) {            final String token = (String) values.nextElement();            IntegerArray nodes = null;            if (index != null) {                nodes = (IntegerArray) index.get(token);            }            // If input was from W3C DOM, use DOM's getElementById to do            // the look-up.            if (nodes == null && _enhancedDOM != null                && _enhancedDOM.hasDOMSource()) {                nodes = getDOMNodeById(token);	            }            // Did we find the context node in the set of nodes?            if (nodes != null && nodes.indexOf(node) >= 0) {                return 1;            }        }        // Didn't find the context node in the set of nodes returned by id        return 0;    }    /**     * <p>Given a context node and the second argument to the XSLT     * <code>key</code> function, checks whether the context node is in the     * set of nodes that results from that reference to the <code>key</code>     * function.  This is used in the implementation of key patterns.</p>     * <p>This particular {@link KeyIndex} object is the result evaluating the     * first argument to the <code>key</code> function, so it's not taken into     * any further account.</p>     *     * @param node The context node     * @param value The second argument to the <code>key</code> function     * @return <code>1</code> if and only if the context node is in the set of     *         nodes returned by the reference to the <code>key</code> function;     *         <code>0</code>, otherwise     */    public int containsKey(int node, Object value) {        int rootHandle = _dom.getAxisIterator(Axis.ROOT)                                 .setStartNode(node).next();        // Get the mapping table for the document containing the context node        Hashtable index =                    (Hashtable) _rootToIndexMap.get(new Integer(rootHandle));        // Check whether the context node is present in the set of nodes        // returned by the key function        if (index != null) {            final IntegerArray nodes = (IntegerArray) index.get(value);            return (nodes != null && nodes.indexOf(node) >= 0) ? 1 : 0;

⌨️ 快捷键说明

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