dtmdocumentimpl.java

来自「java jdk 1.4的源码」· Java 代码 · 共 1,655 行 · 第 1/5 页

JAVA
1,655
字号
// 	 */// 	public int createComment(char ch[], int start, int length)// 	throws DTMException// 	{// 		m_char.append(ch, start, length);		// store the comment string to the text/comment string table// 		// create a Comment Node// 		// %TBD% may be possible to combine with appendNode()to replace the next chunk of code// 		int w0 = COMMENT_NODE;// 		// W1: Parent// 		int w1 = currentParent;// 		// W2: Start position within m_char// 		int w2 = charStringStart;// 		// W3: Length of the full string// 		int w3 = length;// 		int ourslot = appendNode(w0, w1, w2, w3);// 		previousSibling = ourslot;// 		charStringStart=m_char.length();// 		charStringLength = 0;// 		return (m_docHandle | ourslot);// 	}// 	// Counters to keep track of the current text string being accumulated with respect// 	// to the text/comment string table: charStringStart should point to the starting// 	// offset of the string in the table and charStringLength the acccumulated length when// 	// appendAccumulatedText starts, and reset to the end of the table and 0 at the end// 	// of appendAccumulatedText for the next set of characters receives// 	int charStringStart=0,charStringLength=0;        // ========= Document Navigation Functions =========        /** Given a node handle, test if it has child nodes.         * <p> %REVIEW% This is obviously useful at the DOM layer, where it         * would permit testing this without having to create a proxy         * node. It's less useful in the DTM API, where         * (dtm.getFirstChild(nodeHandle)!=DTM.NULL) is just as fast and         * almost as self-evident. But it's a convenience, and eases porting         * of DOM code to DTM.  </p>         *         * @param nodeHandle int Handle of the node.         * @return int true if the given node has child nodes.         */        public boolean hasChildNodes(int nodeHandle) {                return(getFirstChild(nodeHandle) != NULL);        }        /**         * Given a node handle, get the handle of the node's first child.         * If not yet resolved, waits for more nodes to be added to the document and         * tries again.         *         * @param nodeHandle int Handle of the node.         * @return int DTM node-number of first child, or DTM.NULL to indicate none exists.         */        public int getFirstChild(int nodeHandle) {                // ###shs worry about tracing/debug later                nodeHandle &= NODEHANDLE_MASK;                // Read node into variable                nodes.readSlot(nodeHandle, gotslot);                // type is the last half of first slot                short type = (short) (gotslot[0] & 0xFFFF);                // Check to see if Element or Document node                if ((type == ELEMENT_NODE) || (type == DOCUMENT_NODE) ||                                (type == ENTITY_REFERENCE_NODE)) {                        // In case when Document root is given                        //	if (nodeHandle == 0) nodeHandle = 1;                        // %TBD% Probably was a mistake.                        // If someone explicitly asks for first child                        // of Document, I would expect them to want                        // that and only that.                        int kid = nodeHandle + 1;                        nodes.readSlot(kid, gotslot);                        while (ATTRIBUTE_NODE == (gotslot[0] & 0xFFFF)) {                                // points to next sibling                                kid = gotslot[2];                                // Return NULL if node has only attributes                                if (kid == NULL) return NULL;                                nodes.readSlot(kid, gotslot);                        }                        // If parent slot matches given parent, return kid                        if (gotslot[1] == nodeHandle)                        {                          int firstChild = kid | m_docHandle;                          return firstChild;                        }                }                // No child found                return NULL;        }        /**        * Given a node handle, advance to its last child.        * If not yet resolved, waits for more nodes to be added to the document and        * tries again.        *        * @param nodeHandle int Handle of the node.        * @return int Node-number of last child,        * or DTM.NULL to indicate none exists.        */        public int getLastChild(int nodeHandle) {                // ###shs put trace/debug later                nodeHandle &= NODEHANDLE_MASK;                // do not need to test node type since getFirstChild does that                int lastChild = NULL;                for (int nextkid = getFirstChild(nodeHandle); nextkid != NULL;                                nextkid = getNextSibling(nextkid)) {                        lastChild = nextkid;                }                return lastChild | m_docHandle;        }        /**         * Retrieves an attribute node by by qualified name and namespace URI.         *         * @param nodeHandle int Handle of the node upon which to look up this attribute.         * @param namespaceURI The namespace URI of the attribute to         *   retrieve, or null.         * @param name The local name of the attribute to         *   retrieve.         * @return The attribute node handle with the specified name (         *   <code>nodeName</code>) or <code>DTM.NULL</code> if there is no such         *   attribute.         */        public int getAttributeNode(int nodeHandle, String namespaceURI, String name) {                int nsIndex = m_nsNames.stringToIndex(namespaceURI),                                                                        nameIndex = m_localNames.stringToIndex(name);                nodeHandle &= NODEHANDLE_MASK;                nodes.readSlot(nodeHandle, gotslot);                short type = (short) (gotslot[0] & 0xFFFF);                // If nodeHandle points to element next slot would be first attribute                if (type == ELEMENT_NODE)                        nodeHandle++;                // Iterate through Attribute Nodes                while (type == ATTRIBUTE_NODE) {                        if ((nsIndex == (gotslot[0] << 16)) && (gotslot[3] == nameIndex))                                return nodeHandle | m_docHandle;                        // Goto next sibling                        nodeHandle = gotslot[2];                        nodes.readSlot(nodeHandle, gotslot);                }                return NULL;        }        /**         * Given a node handle, get the index of the node's first attribute.         *         * @param nodeHandle int Handle of the Element node.         * @return Handle of first attribute, or DTM.NULL to indicate none exists.         */        public int getFirstAttribute(int nodeHandle) {                nodeHandle &= NODEHANDLE_MASK;                // %REVIEW% jjk: Just a quick observation: If you're going to                // call readEntry repeatedly on the same node, it may be                // more efficiently to do a readSlot to get the data locally,                // reducing the addressing and call-and-return overhead.                // Should we check if handle is element (do we want sanity checks?)                if (ELEMENT_NODE != (nodes.readEntry(nodeHandle, 0) & 0xFFFF))                        return NULL;                // First Attribute (if any) should be at next position in table                nodeHandle++;                return(ATTRIBUTE_NODE == (nodes.readEntry(nodeHandle, 0) & 0xFFFF)) ?                nodeHandle | m_docHandle : NULL;        }        /**         * Given a node handle, get the index of the node's first child.         * If not yet resolved, waits for more nodes to be added to the document and         * tries again         *         * @param nodeHandle handle to node, which should probably be an element         *                   node, but need not be.         *         * @param inScope    true if all namespaces in scope should be returned,         *                   false if only the namespace declarations should be         *                   returned.         * @return handle of first namespace, or DTM.NULL to indicate none exists.         */        public int getFirstNamespaceNode(int nodeHandle, boolean inScope) {                return NULL;        }        /**         * Given a node handle, advance to its next sibling.         *         * %TBD% This currently uses the DTM-internal definition of         * sibling; eg, the last attr's next sib is the first         * child. In the old DTM, the DOM proxy layer provided the         * additional logic for the public view.  If we're rewriting         * for XPath emulation, that test must be done here.         *         * %TBD% CODE INTERACTION WITH INCREMENTAL PARSE - If not yet         * resolved, should wait for more nodes to be added to the document         * and tries again.         *         * @param nodeHandle int Handle of the node.         * @return int Node-number of next sibling,         * or DTM.NULL to indicate none exists.         * */        public int getNextSibling(int nodeHandle) {                nodeHandle &= NODEHANDLE_MASK;                // Document root has no next sibling                if (nodeHandle == 0)                        return NULL;                short type = (short) (nodes.readEntry(nodeHandle, 0) & 0xFFFF);                if ((type == ELEMENT_NODE) || (type == ATTRIBUTE_NODE) ||                                (type == ENTITY_REFERENCE_NODE)) {                        int nextSib = nodes.readEntry(nodeHandle, 2);                        if (nextSib == NULL)                                return NULL;                        if (nextSib != 0)                                return (m_docHandle | nextSib);                        // ###shs should cycle/wait if nextSib is 0? Working on threading next                }                // Next Sibling is in the next position if it shares the same parent                int thisParent = nodes.readEntry(nodeHandle, 1);                if (nodes.readEntry(++nodeHandle, 1) == thisParent)                        return (m_docHandle | nodeHandle);                return NULL;        }        /**         * Given a node handle, find its preceeding sibling.         * WARNING: DTM is asymmetric; this operation is resolved by search, and is         * relatively expensive.         *         * @param nodeHandle the id of the node.         * @return int Node-number of the previous sib,         * or DTM.NULL to indicate none exists.         */        public int getPreviousSibling(int nodeHandle) {                nodeHandle &= NODEHANDLE_MASK;                // Document root has no previous sibling                if (nodeHandle == 0)                        return NULL;                int parent = nodes.readEntry(nodeHandle, 1);                int kid = NULL;                for (int nextkid = getFirstChild(parent); nextkid != nodeHandle;                                nextkid = getNextSibling(nextkid)) {                        kid = nextkid;                }                return kid | m_docHandle;        }        /**         * Given a node handle, advance to the next attribute. If an         * element, we advance to its first attribute; if an attr, we advance to         * the next attr on the same node.         *         * @param nodeHandle int Handle of the node.         * @return int DTM node-number of the resolved attr,         * or DTM.NULL to indicate none exists.         */        public int getNextAttribute(int nodeHandle) {                nodeHandle &= NODEHANDLE_MASK;                nodes.readSlot(nodeHandle, gotslot);                //%REVIEW% Why are we using short here? There's no storage                //reduction for an automatic variable, especially one used                //so briefly, and it typically costs more cycles to process                //than an int would.                short type = (short) (gotslot[0] & 0xFFFF);                if (type == ELEMENT_NODE) {                        return getFirstAttribute(nodeHandle);                } else if (type == ATTRIBUTE_NODE) {                        if (gotslot[2] != NULL)                                return (m_docHandle | gotslot[2]);                }                return NULL;        }        /**         * Given a namespace handle, advance to the next namespace.         *         * %TBD% THIS METHOD DOES NOT MATCH THE CURRENT SIGNATURE IN         * THE DTM INTERFACE.  FIX IT, OR JUSTIFY CHANGING THE DTM         * API.         *         * @param namespaceHandle handle to node which must be of type NAMESPACE_NODE.         * @return handle of next namespace, or DTM.NULL to indicate none exists.         */        public int getNextNamespaceNode(int baseHandle,int namespaceHandle, boolean inScope) {                // ###shs need to work on namespace                return NULL;        }        /**         * Given a node handle, advance to its next descendant.         * If not yet resolved, waits for more nodes to be added to the document and         * tries again.         *         * @param subtreeRootNodeHandle         * @param nodeHandle int Handle of the node.         * @return handle of next descendant,         * or DTM.NULL to indicate none exists.         */        public int getNextDescendant(int subtreeRootHandle, int nodeHandle) {                subtreeRootHandle &= NODEHANDLE_MASK;                nodeHandle &= NODEHANDLE_MASK;                // Document root [Document Node? -- jjk] - no next-sib                if (nodeHandle == 0)                        return NULL;                while (!m_isError) {                        // Document done and node out of bounds                        if (done && (nodeHandle > nodes.slotsUsed()))                                break;                        if (nodeHandle > subtreeRootHandle) {                                nodes.readSlot(nodeHandle+1, gotslot);                                if (gotslot[2] != 0) {                                        short type = (short) (gotslot[0] & 0xFFFF);                                        if (type == ATTRIBUTE_NODE) {                                                nodeHandle +=2;                                        } else {                                                int nextParentPos = gotslot[1];                                                if (nextParentPos >= subtreeRootHandle)                                                        return (m_docHandle | (nodeHandle+1));

⌨️ 快捷键说明

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