1. package org.apache.xpath.objects;
  2. import org.w3c.dom.Node;
  3. import org.w3c.dom.NodeList;
  4. import org.w3c.dom.traversal.NodeIterator;
  5. import org.apache.xml.dtm.*;
  6. import org.apache.xpath.NodeSetDTM;
  7. import org.apache.xpath.XPathContext;
  8. /**
  9. * This class overrides the XNodeSet#object() method to provide the original
  10. * Node object, NodeList object, or NodeIterator.
  11. */
  12. public class XNodeSetForDOM extends XNodeSet
  13. {
  14. Object m_origObj;
  15. public XNodeSetForDOM(Node node, DTMManager dtmMgr)
  16. {
  17. m_dtmMgr = dtmMgr;
  18. m_origObj = node;
  19. int dtmHandle = dtmMgr.getDTMHandleFromNode(node);
  20. m_obj = new NodeSetDTM(dtmMgr);
  21. ((NodeSetDTM) m_obj).addNode(dtmHandle);
  22. }
  23. /**
  24. * Construct a XNodeSet object.
  25. *
  26. * @param val Value of the XNodeSet object
  27. */
  28. public XNodeSetForDOM(XNodeSet val)
  29. {
  30. super(val);
  31. if(val instanceof XNodeSetForDOM)
  32. m_origObj = ((XNodeSetForDOM)val).m_origObj;
  33. }
  34. public XNodeSetForDOM(NodeList nodeList, XPathContext xctxt)
  35. {
  36. m_dtmMgr = xctxt.getDTMManager();
  37. m_origObj = nodeList;
  38. // JKESS 20020514: Longer-term solution is to force
  39. // folks to request length through an accessor, so we can defer this
  40. // retrieval... but that requires an API change.
  41. // m_obj=new org.apache.xpath.NodeSetDTM(nodeList, xctxt);
  42. org.apache.xpath.NodeSetDTM nsdtm=new org.apache.xpath.NodeSetDTM(nodeList, xctxt);
  43. m_last=nsdtm.getLength();
  44. m_obj = nsdtm;
  45. }
  46. public XNodeSetForDOM(NodeIterator nodeIter, XPathContext xctxt)
  47. {
  48. m_dtmMgr = xctxt.getDTMManager();
  49. m_origObj = nodeIter;
  50. // JKESS 20020514: Longer-term solution is to force
  51. // folks to request length through an accessor, so we can defer this
  52. // retrieval... but that requires an API change.
  53. // m_obj = new org.apache.xpath.NodeSetDTM(nodeIter, xctxt);
  54. org.apache.xpath.NodeSetDTM nsdtm=new org.apache.xpath.NodeSetDTM(nodeIter, xctxt);
  55. m_last=nsdtm.getLength();
  56. m_obj = nsdtm;
  57. }
  58. /**
  59. * Return the original DOM object that the user passed in. For use primarily
  60. * by the extension mechanism.
  61. *
  62. * @return The object that this class wraps
  63. */
  64. public Object object()
  65. {
  66. return m_origObj;
  67. }
  68. /**
  69. * Cast result object to a nodelist. Always issues an error.
  70. *
  71. * @return null
  72. *
  73. * @throws javax.xml.transform.TransformerException
  74. */
  75. public NodeIterator nodeset() throws javax.xml.transform.TransformerException
  76. {
  77. return (m_origObj instanceof NodeIterator)
  78. ? (NodeIterator)m_origObj : super.nodeset();
  79. }
  80. /**
  81. * Cast result object to a nodelist. Always issues an error.
  82. *
  83. * @return null
  84. *
  85. * @throws javax.xml.transform.TransformerException
  86. */
  87. public NodeList nodelist() throws javax.xml.transform.TransformerException
  88. {
  89. return (m_origObj instanceof NodeList)
  90. ? (NodeList)m_origObj : super.nodelist();
  91. }
  92. }