zongaro 2002/12/17 11:06:42 Modified: java/src/org/apache/xml/dtm/ref Tag: XSLTC_DTM DTMDefaultBase.java DTMDefaultBaseIterators.java Log: Added getFirstAttributeIdentity and getNextAttributeIdentity methods to DTMDefaultBase that take a node identity as input and return a node identity. That avoids some overhead of decoding a handle when iterating through attributes. Revision Changes Path No revision No revision 1.28.2.7 +39 -25 xml-xalan/java/src/org/apache/xml/dtm/ref/DTMDefaultBase.java Index: DTMDefaultBase.java =================================================================== RCS file: /home/cvs/xml-xalan/java/src/org/apache/xml/dtm/ref/DTMDefaultBase.java,v retrieving revision 1.28.2.6 retrieving revision 1.28.2.7 diff -u -r1.28.2.6 -r1.28.2.7 --- DTMDefaultBase.java 10 Dec 2002 18:48:44 -0000 1.28.2.6 +++ DTMDefaultBase.java 17 Dec 2002 19:06:41 -0000 1.28.2.7 @@ -552,7 +552,6 @@ */ protected int _nextsib(int identity) { - // Boiler-plate code for each of the _xxx functions, except for the array. int info = (identity >= m_size) ? NOTPROCESSED : m_nextsib.elementAt(identity); @@ -1040,15 +1039,23 @@ */ public int getFirstAttribute(int nodeHandle) { + int nodeID = makeNodeIdentity(nodeHandle); - int type = getNodeType(nodeHandle); + return makeNodeHandle(getFirstAttributeIdentity(nodeID)); + } + + /** + * Given a node identity, get the index of the node's first attribute. + * + * @param identity int identity of the node. + * @return Identity of first attribute, or DTM.NULL to indicate none exists. + */ + protected int getFirstAttributeIdentity(int identity) { + int type = _type(identity); if (DTM.ELEMENT_NODE == type) { - // Assume that attributes and namespaces immediately follow the element. - int identity = makeNodeIdentity(nodeHandle); - while (DTM.NULL != (identity = getNextNodeIdentity(identity))) { @@ -1057,7 +1064,7 @@ if (type == DTM.ATTRIBUTE_NODE) { - return makeNodeHandle(identity); + return identity; } else if (DTM.NAMESPACE_NODE != type) { @@ -1163,28 +1170,35 @@ * @return int DTM node-number of the resolved attr, * or DTM.NULL to indicate none exists. */ - public int getNextAttribute(int nodeHandle) - { - - int type = getNodeType(nodeHandle); + public int getNextAttribute(int nodeHandle) { + int nodeID = makeNodeIdentity(nodeHandle); - if (DTM.ATTRIBUTE_NODE == type) - { - // Assume that attributes and namespace nodes immediately follow the element. - int identity = makeNodeIdentity(nodeHandle); + if (_type(nodeID) == DTM.ATTRIBUTE_NODE) { + return makeNodeHandle(getNextAttributeIdentity(nodeID)); + } - while (DTM.NULL != (identity = getNextNodeIdentity(identity))) - { - type = _type(identity); + return DTM.NULL; + } - if (type == DTM.ATTRIBUTE_NODE) - { - return makeNodeHandle(identity); - } - else if (type != DTM.NAMESPACE_NODE) - { - break; - } + /** + * Given a node identity for an attribute, advance to the next attribute. + * + * @param identity int identity of the attribute node. This + * <strong>must</strong> be an attribute node. + * + * @return int DTM node-identity of the resolved attr, + * or DTM.NULL to indicate none exists. + * + */ + protected int getNextAttributeIdentity(int identity) { + // Assume that attributes and namespace nodes immediately follow the element + while (DTM.NULL != (identity = getNextNodeIdentity(identity))) { + int type = _type(identity); + + if (type == DTM.ATTRIBUTE_NODE) { + return identity; + } else if (type != DTM.NAMESPACE_NODE) { + break; } } 1.12.2.9 +6 -3 xml-xalan/java/src/org/apache/xml/dtm/ref/DTMDefaultBaseIterators.java Index: DTMDefaultBaseIterators.java =================================================================== RCS file: /home/cvs/xml-xalan/java/src/org/apache/xml/dtm/ref/DTMDefaultBaseIterators.java,v retrieving revision 1.12.2.8 retrieving revision 1.12.2.9 diff -u -r1.12.2.8 -r1.12.2.9 --- DTMDefaultBaseIterators.java 8 Dec 2002 12:08:14 -0000 1.12.2.8 +++ DTMDefaultBaseIterators.java 17 Dec 2002 19:06:41 -0000 1.12.2.9 @@ -943,7 +943,7 @@ if (_isRestartable) { _startNode = node; - _currentNode = getFirstAttribute(node); + _currentNode = getFirstAttributeIdentity(makeNodeIdentity(node)); return resetPosition(); } @@ -961,9 +961,12 @@ final int node = _currentNode; - _currentNode = getNextAttribute(node); + if (node != NULL) { + _currentNode = getNextAttributeIdentity(node); + return returnNode(makeNodeHandle(node)); + } - return returnNode(node); + return NULL; } } // end of AttributeIterator
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]