001: /*
002: * Copyright 1999-2004 The Apache Software Foundation.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: /*
017: * $Id: XNodeSetForDOM.java,v 1.7 2004/08/17 19:25:39 jycli Exp $
018: */
019: package org.apache.xpath.objects;
020:
021: import org.apache.xml.dtm.DTMManager;
022: import org.apache.xpath.NodeSetDTM;
023: import org.apache.xpath.XPathContext;
024:
025: import org.w3c.dom.Node;
026: import org.w3c.dom.NodeList;
027: import org.w3c.dom.traversal.NodeIterator;
028:
029: /**
030: * This class overrides the XNodeSet#object() method to provide the original
031: * Node object, NodeList object, or NodeIterator.
032: */
033: public class XNodeSetForDOM extends XNodeSet {
034: static final long serialVersionUID = -8396190713754624640L;
035: Object m_origObj;
036:
037: public XNodeSetForDOM(Node node, DTMManager dtmMgr) {
038: m_dtmMgr = dtmMgr;
039: m_origObj = node;
040: int dtmHandle = dtmMgr.getDTMHandleFromNode(node);
041: m_obj = new NodeSetDTM(dtmMgr);
042: ((NodeSetDTM) m_obj).addNode(dtmHandle);
043: }
044:
045: /**
046: * Construct a XNodeSet object.
047: *
048: * @param val Value of the XNodeSet object
049: */
050: public XNodeSetForDOM(XNodeSet val) {
051: super (val);
052: if (val instanceof XNodeSetForDOM)
053: m_origObj = ((XNodeSetForDOM) val).m_origObj;
054: }
055:
056: public XNodeSetForDOM(NodeList nodeList, XPathContext xctxt) {
057: m_dtmMgr = xctxt.getDTMManager();
058: m_origObj = nodeList;
059:
060: // JKESS 20020514: Longer-term solution is to force
061: // folks to request length through an accessor, so we can defer this
062: // retrieval... but that requires an API change.
063: // m_obj=new org.apache.xpath.NodeSetDTM(nodeList, xctxt);
064: org.apache.xpath.NodeSetDTM nsdtm = new org.apache.xpath.NodeSetDTM(
065: nodeList, xctxt);
066: m_last = nsdtm.getLength();
067: m_obj = nsdtm;
068: }
069:
070: public XNodeSetForDOM(NodeIterator nodeIter, XPathContext xctxt) {
071: m_dtmMgr = xctxt.getDTMManager();
072: m_origObj = nodeIter;
073:
074: // JKESS 20020514: Longer-term solution is to force
075: // folks to request length through an accessor, so we can defer this
076: // retrieval... but that requires an API change.
077: // m_obj = new org.apache.xpath.NodeSetDTM(nodeIter, xctxt);
078: org.apache.xpath.NodeSetDTM nsdtm = new org.apache.xpath.NodeSetDTM(
079: nodeIter, xctxt);
080: m_last = nsdtm.getLength();
081: m_obj = nsdtm;
082: }
083:
084: /**
085: * Return the original DOM object that the user passed in. For use primarily
086: * by the extension mechanism.
087: *
088: * @return The object that this class wraps
089: */
090: public Object object() {
091: return m_origObj;
092: }
093:
094: /**
095: * Cast result object to a nodelist. Always issues an error.
096: *
097: * @return null
098: *
099: * @throws javax.xml.transform.TransformerException
100: */
101: public NodeIterator nodeset()
102: throws javax.xml.transform.TransformerException {
103: return (m_origObj instanceof NodeIterator) ? (NodeIterator) m_origObj
104: : super .nodeset();
105: }
106:
107: /**
108: * Cast result object to a nodelist. Always issues an error.
109: *
110: * @return null
111: *
112: * @throws javax.xml.transform.TransformerException
113: */
114: public NodeList nodelist()
115: throws javax.xml.transform.TransformerException {
116: return (m_origObj instanceof NodeList) ? (NodeList) m_origObj
117: : super.nodelist();
118: }
119:
120: }
|