001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements. See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership. The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the  "License");
007     * you may not use this file except in compliance with the License.
008     * You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    /*
019     * $Id: AdaptiveResultTreeImpl.java 468651 2006-10-28 07:04:25Z minchau $
020     */
021    package org.apache.xalan.xsltc.dom;
022    
023    import org.apache.xalan.xsltc.DOM;
024    import org.apache.xalan.xsltc.TransletException;
025    import org.apache.xalan.xsltc.StripFilter;
026    import org.apache.xalan.xsltc.runtime.Hashtable;
027    import org.apache.xalan.xsltc.runtime.BasisLibrary;
028    import org.apache.xalan.xsltc.runtime.AttributeList;
029    
030    import org.apache.xml.dtm.DTMAxisIterator;
031    import org.apache.xml.dtm.DTMAxisTraverser;
032    import org.apache.xml.dtm.DTMWSFilter;
033    import org.apache.xml.utils.XMLString;
034    
035    import org.apache.xml.serializer.SerializationHandler;
036    
037    import javax.xml.transform.SourceLocator;
038    import org.w3c.dom.Node;
039    import org.w3c.dom.NodeList;
040    import org.xml.sax.Attributes;
041    import org.xml.sax.SAXException;
042    
043    /**
044     * AdaptiveResultTreeImpl is a adaptive DOM model for result tree fragments (RTF). It is
045     * used in the case where the RTF is likely to be pure text yet it can still be a DOM tree. 
046     * It is designed for RTFs which have <xsl:call-template> or <xsl:apply-templates> in 
047     * the contents. Example:
048     * <pre>
049     *    &lt;xsl:variable name = "x"&gt;
050     *      &lt;xsl:call-template name = "test"&gt;
051     *         &lt;xsl:with-param name="a" select="."/&gt;
052     *      &lt;/xsl:call-template&gt;
053     *    &lt;/xsl:variable>
054     * </pre>
055     * <p>In this example the result produced by <xsl:call-template> is likely to be a single
056     * Text node. But it can also be a DOM tree. This kind of RTF cannot be modelled by 
057     * SimpleResultTreeImpl. 
058     * <p>
059     * AdaptiveResultTreeImpl can be considered as a smart switcher between SimpleResultTreeImpl
060     * and SAXImpl. It treats the RTF as simple Text and uses the SimpleResultTreeImpl model
061     * at the beginning. However, if it receives a call which indicates that this is a DOM tree
062     * (e.g. startElement), it will automatically transform itself into a wrapper around a 
063     * SAXImpl. In this way we can have a light-weight model when the result only contains
064     * simple text, while at the same time it still works when the RTF is a DOM tree.
065     * <p>
066     * All methods in this class are overridden to delegate the action to the wrapped SAXImpl object
067     * if it is non-null, or delegate the action to the SimpleResultTreeImpl if there is no
068     * wrapped SAXImpl.
069     * <p>
070     * %REVISIT% Can we combine this class with SimpleResultTreeImpl? I think it is possible, but
071     * it will make SimpleResultTreeImpl more expensive. I will use two separate classes at 
072     * this time.
073     */
074    public class AdaptiveResultTreeImpl extends SimpleResultTreeImpl
075    {
076        
077        // Document URI index, which increases by 1 at each getDocumentURI() call.
078        private static int _documentURIIndex = 0;
079    
080        // The SAXImpl object wrapped by this class, if the RTF is a tree.
081        private SAXImpl _dom;
082        
083        /** The following fields are only used for the nested SAXImpl **/
084        
085        // The whitespace filter
086        private DTMWSFilter _wsfilter;
087        
088        // The size of the RTF
089        private int _initSize;
090        
091        // True if we want to build the ID index table
092        private boolean _buildIdIndex;
093        
094        // The AttributeList
095        private final AttributeList  _attributes = new AttributeList();
096        
097        // The element name
098        private String _openElementName;
099        
100        
101        // Create a AdaptiveResultTreeImpl
102        public AdaptiveResultTreeImpl(XSLTCDTMManager dtmManager, int documentID,
103                                      DTMWSFilter wsfilter, int initSize,
104                                      boolean buildIdIndex)
105        {
106            super(dtmManager, documentID);
107            
108            _wsfilter = wsfilter;
109            _initSize = initSize;
110            _buildIdIndex = buildIdIndex;
111        }
112        
113        // Return the DOM object wrapped in this object.
114        public DOM getNestedDOM()
115        {
116            return _dom;
117        }
118            
119        // Return the document ID
120        public int getDocument()
121        {
122            if (_dom != null) {
123                return _dom.getDocument();
124            }
125            else {
126                return super.getDocument();
127            }
128        }
129    
130        // Return the String value of the RTF
131        public String getStringValue()
132        {
133            if (_dom != null) {
134                return _dom.getStringValue();
135            }
136            else {
137                return super.getStringValue();
138            }
139        }
140        
141        public DTMAxisIterator getIterator()
142        {
143            if (_dom != null) {
144                return _dom.getIterator();
145            }
146            else {
147                return super.getIterator();
148            }
149        }
150            
151        public DTMAxisIterator getChildren(final int node)
152        {
153            if (_dom != null) {
154                return _dom.getChildren(node);
155            }
156            else {
157                return super.getChildren(node);
158            }
159        }
160        
161        public DTMAxisIterator getTypedChildren(final int type)
162        {
163            if (_dom != null) {
164                return _dom.getTypedChildren(type);
165            }
166            else {
167                return super.getTypedChildren(type);
168            }
169        }
170        
171        public DTMAxisIterator getAxisIterator(final int axis)
172        {
173            if (_dom != null) {
174                return _dom.getAxisIterator(axis);
175            }
176            else {
177                return super.getAxisIterator(axis);
178            }
179        }
180        
181        public DTMAxisIterator getTypedAxisIterator(final int axis, final int type)
182        {
183            if (_dom != null) {
184                return _dom.getTypedAxisIterator(axis, type);
185            }
186            else {
187                return super.getTypedAxisIterator(axis, type);
188            }        
189        }
190        
191        public DTMAxisIterator getNthDescendant(int node, int n, boolean includeself)
192        {
193            if (_dom != null) {
194                return _dom.getNthDescendant(node, n, includeself);
195            }
196            else {
197                return super.getNthDescendant(node, n, includeself);
198            }
199        }
200        
201        public DTMAxisIterator getNamespaceAxisIterator(final int axis, final int ns)
202        {
203            if (_dom != null) {
204                return _dom.getNamespaceAxisIterator(axis, ns);
205            }
206            else {
207                return super.getNamespaceAxisIterator(axis, ns);
208            }
209        }
210        
211        public DTMAxisIterator getNodeValueIterator(DTMAxisIterator iter, int returnType,
212                                                 String value, boolean op)
213        {
214            if (_dom != null) {
215                return _dom.getNodeValueIterator(iter, returnType, value, op);
216            }
217            else {
218                return super.getNodeValueIterator(iter, returnType, value, op);
219            }
220        }
221        
222        public DTMAxisIterator orderNodes(DTMAxisIterator source, int node)
223        {
224            if (_dom != null) {
225                return _dom.orderNodes(source, node);
226            }
227            else {
228                return super.orderNodes(source, node);
229            }
230        }
231        
232        public String getNodeName(final int node)
233        {
234            if (_dom != null) {
235                return _dom.getNodeName(node);
236            }
237            else {
238                return super.getNodeName(node);
239            }
240        }
241        
242        public String getNodeNameX(final int node)
243        {
244            if (_dom != null) {
245                return _dom.getNodeNameX(node);
246            }
247            else {
248                return super.getNodeNameX(node);
249            }
250        }
251        
252        public String getNamespaceName(final int node)
253        {
254            if (_dom != null) {
255                return _dom.getNamespaceName(node);
256            }
257            else {
258                return super.getNamespaceName(node);
259            }
260        }
261        
262        // Return the expanded type id of a given node
263        public int getExpandedTypeID(final int nodeHandle)
264        {
265            if (_dom != null) {
266                return _dom.getExpandedTypeID(nodeHandle);
267            }
268            else {
269                return super.getExpandedTypeID(nodeHandle);
270            }
271        }
272        
273        public int getNamespaceType(final int node)
274        {
275            if (_dom != null) {
276                return _dom.getNamespaceType(node);
277            }
278            else {
279                return super.getNamespaceType(node);
280            }
281        }
282        
283        public int getParent(final int nodeHandle)
284        {
285            if (_dom != null) {
286                return _dom.getParent(nodeHandle);
287            }
288            else {
289                return super.getParent(nodeHandle);
290            }
291        }
292        
293        public int getAttributeNode(final int gType, final int element)
294        {
295            if (_dom != null) {
296                return _dom.getAttributeNode(gType, element);
297            }
298            else {
299                return super.getAttributeNode(gType, element);
300            }
301        }
302        
303        public String getStringValueX(final int nodeHandle)
304        {
305            if (_dom != null) {
306                return _dom.getStringValueX(nodeHandle);
307            }
308            else {
309                return super.getStringValueX(nodeHandle);
310            }
311        }
312        
313        public void copy(final int node, SerializationHandler handler)
314            throws TransletException
315        {
316            if (_dom != null) {
317                _dom.copy(node, handler);
318            }
319            else {
320                super.copy(node, handler);
321            }
322        }
323        
324        public void copy(DTMAxisIterator nodes, SerializationHandler handler)
325            throws TransletException
326        {
327            if (_dom != null) {
328                _dom.copy(nodes, handler);
329            }
330            else {
331                super.copy(nodes, handler);
332            }
333        }
334        
335        public String shallowCopy(final int node, SerializationHandler handler)
336            throws TransletException
337        {
338            if (_dom != null) {
339                return _dom.shallowCopy(node, handler);
340            }
341            else {
342                return super.shallowCopy(node, handler);
343            }
344        }
345        
346        public boolean lessThan(final int node1, final int node2)
347        {
348            if (_dom != null) {
349                return _dom.lessThan(node1, node2);
350            }
351            else {
352                return super.lessThan(node1, node2);
353            }
354        }
355        
356        /**
357         * Dispatch the character content of a node to an output handler.
358         *
359         * The escape setting should be taken care of when outputting to
360         * a handler.
361         */
362        public void characters(final int node, SerializationHandler handler)
363            throws TransletException
364        {
365            if (_dom != null) {
366                _dom.characters(node, handler);
367            }
368            else {
369                super.characters(node, handler);
370            }        
371        }
372        
373        public Node makeNode(int index)
374        {
375            if (_dom != null) {
376                return _dom.makeNode(index);
377            }
378            else {
379                return super.makeNode(index);
380            }        
381        }
382        
383        public Node makeNode(DTMAxisIterator iter)
384        {
385            if (_dom != null) {
386                return _dom.makeNode(iter);
387            }
388            else {
389                return super.makeNode(iter);
390            }        
391        }
392        
393        public NodeList makeNodeList(int index)
394        {
395            if (_dom != null) {
396                return _dom.makeNodeList(index);
397            }
398            else {
399                return super.makeNodeList(index);
400            }        
401        }
402        
403        public NodeList makeNodeList(DTMAxisIterator iter)
404        {
405            if (_dom != null) {
406                return _dom.makeNodeList(iter);
407            }
408            else {
409                return super.makeNodeList(iter);
410            }        
411        }
412        
413        public String getLanguage(int node)
414        {
415            if (_dom != null) {
416                return _dom.getLanguage(node);
417            }
418            else {
419                return super.getLanguage(node);
420            }        
421        }
422        
423        public int getSize()
424        {
425            if (_dom != null) {
426                return _dom.getSize();
427            }
428            else {
429                return super.getSize();
430            }        
431        }
432        
433        public String getDocumentURI(int node)
434        {
435            if (_dom != null) {
436                return _dom.getDocumentURI(node);
437            }
438            else {
439                return "adaptive_rtf" + _documentURIIndex++;
440            }        
441        }
442        
443        public void setFilter(StripFilter filter)
444        {
445            if (_dom != null) {
446                _dom.setFilter(filter);
447            }
448            else {
449                super.setFilter(filter);
450            }        
451        }
452        
453        public void setupMapping(String[] names, String[] uris, int[] types, String[] namespaces)
454        {
455            if (_dom != null) {
456                _dom.setupMapping(names, uris, types, namespaces);
457            }
458            else {
459                super.setupMapping(names, uris, types, namespaces);
460            }        
461        }
462        
463        public boolean isElement(final int node)
464        {
465            if (_dom != null) {
466                return _dom.isElement(node);
467            }
468            else {
469                return super.isElement(node);
470            }        
471        }
472        
473        public boolean isAttribute(final int node)
474        {
475            if (_dom != null) {
476                return _dom.isAttribute(node);
477            }
478            else {
479                return super.isAttribute(node);
480            }        
481        }
482        
483        public String lookupNamespace(int node, String prefix)
484            throws TransletException
485        {
486            if (_dom != null) {
487                return _dom.lookupNamespace(node, prefix);
488            }
489            else {
490                return super.lookupNamespace(node, prefix);
491            }        
492        }
493        
494        /**
495         * Return the node identity from a node handle.
496         */
497        public final int getNodeIdent(final int nodehandle)
498        {
499            if (_dom != null) {
500                return _dom.getNodeIdent(nodehandle);
501            }
502            else {
503                return super.getNodeIdent(nodehandle);
504            }        
505        }
506        
507        /**
508         * Return the node handle from a node identity.
509         */
510        public final int getNodeHandle(final int nodeId)
511        {
512            if (_dom != null) {
513                return _dom.getNodeHandle(nodeId);
514            }
515            else {
516                return super.getNodeHandle(nodeId);
517            }        
518        }
519        
520        public DOM getResultTreeFrag(int initialSize, int rtfType)
521        {
522            if (_dom != null) {
523                return _dom.getResultTreeFrag(initialSize, rtfType);
524            }
525            else {
526                return super.getResultTreeFrag(initialSize, rtfType);
527            }        
528        }
529        
530        public SerializationHandler getOutputDomBuilder()
531        {
532            return this;
533        }
534        
535        public int getNSType(int node)
536        {
537            if (_dom != null) {
538                return _dom.getNSType(node);
539            }
540            else {
541                return super.getNSType(node);
542            }        
543        }
544        
545        public String getUnparsedEntityURI(String name)
546        {
547            if (_dom != null) {
548                return _dom.getUnparsedEntityURI(name);
549            }
550            else {
551                return super.getUnparsedEntityURI(name);
552            }        
553        }
554        
555        public Hashtable getElementsWithIDs()
556        {
557            if (_dom != null) {
558                return _dom.getElementsWithIDs();
559            }
560            else {
561                return super.getElementsWithIDs();
562            }        
563        }
564    
565        /** Implementation of the SerializationHandler interfaces **/
566            
567        /** The code in some of the following interfaces are copied from SAXAdapter. **/
568        
569        private void maybeEmitStartElement() throws SAXException
570        {
571            if (_openElementName != null) {
572    
573               int index;
574               if ((index =_openElementName.indexOf(":")) < 0)
575                   _dom.startElement(null, _openElementName, _openElementName, _attributes);
576               else
577                   _dom.startElement(null, _openElementName.substring(index+1), _openElementName, _attributes);
578    
579    
580                _openElementName = null;
581            }
582        }
583        
584        // Create and initialize the wrapped SAXImpl object
585        private void prepareNewDOM() throws SAXException
586        {
587            _dom = (SAXImpl)_dtmManager.getDTM(null, true, _wsfilter,
588                                      true, false, false,
589                                      _initSize, _buildIdIndex);
590            _dom.startDocument();
591            // Flush pending Text nodes to SAXImpl
592            for (int i = 0; i < _size; i++) {
593                String str = _textArray[i];
594                _dom.characters(str.toCharArray(), 0, str.length());
595            }
596            _size = 0;
597        }
598        
599        public void startDocument() throws SAXException
600        {    
601        }
602        
603        public void endDocument() throws SAXException
604        {
605            if (_dom != null) {
606                _dom.endDocument();
607            }
608            else {
609                super.endDocument();
610            }
611        }
612    
613        public void characters(String str) throws SAXException
614        {
615            if (_dom != null) {
616                characters(str.toCharArray(), 0, str.length());
617            }
618            else {
619                super.characters(str);
620            }
621        }
622        
623        public void characters(char[] ch, int offset, int length)
624            throws SAXException
625        {
626            if (_dom != null) {
627                maybeEmitStartElement();
628                _dom.characters(ch, offset, length);
629            }
630            else {
631                super.characters(ch, offset, length);
632            }
633        }
634        
635        public boolean setEscaping(boolean escape) throws SAXException
636        {
637            if (_dom != null) {
638                return _dom.setEscaping(escape);
639            }
640            else {
641                return super.setEscaping(escape);
642            }
643        }
644        
645        public void startElement(String elementName) throws SAXException
646        {
647            if (_dom == null) {
648                prepareNewDOM();
649            }
650                                
651            maybeEmitStartElement();
652            _openElementName = elementName;
653            _attributes.clear();
654        }
655    
656        public void startElement(String uri, String localName, String qName)
657            throws SAXException
658        {
659            startElement(qName);
660        }
661    
662        public void startElement(String uri, String localName, String qName, Attributes attributes)
663            throws SAXException
664        {
665            startElement(qName);
666        }
667        
668        public void endElement(String elementName) throws SAXException
669        {    
670            maybeEmitStartElement();
671            _dom.endElement(null, null, elementName);
672        }
673    
674        public void endElement(String uri, String localName, String qName)
675            throws SAXException
676        {
677            endElement(qName);
678        }
679    
680     public void addUniqueAttribute(String qName, String value, int flags)
681            throws SAXException
682        {
683            addAttribute(qName, value); 
684        }
685    
686        public void addAttribute(String name, String value)
687        {    
688            if (_openElementName != null) {
689                _attributes.add(name, value);
690            }
691            else {
692                BasisLibrary.runTimeError(BasisLibrary.STRAY_ATTRIBUTE_ERR, name);
693            }
694        }
695    
696        public void namespaceAfterStartElement(String prefix, String uri)
697            throws SAXException
698        {    
699            if (_dom == null) {
700               prepareNewDOM(); 
701            }
702            
703            _dom.startPrefixMapping(prefix, uri);
704        }
705        
706        public void comment(String comment) throws SAXException
707        {    
708            if (_dom == null) {
709               prepareNewDOM(); 
710            }
711            
712            maybeEmitStartElement();
713            char[] chars = comment.toCharArray();
714            _dom.comment(chars, 0, chars.length);
715        }
716    
717        public void comment(char[] chars, int offset, int length)
718            throws SAXException
719        {    
720            if (_dom == null) {
721               prepareNewDOM(); 
722            }
723            
724            maybeEmitStartElement();
725            _dom.comment(chars, offset, length);
726        }
727        
728        public void processingInstruction(String target, String data)
729            throws SAXException
730        {    
731            if (_dom == null) {
732               prepareNewDOM(); 
733            }
734            
735            maybeEmitStartElement();
736            _dom.processingInstruction(target, data);
737        }
738        
739        /** Implementation of the DTM interfaces **/
740             
741        public void setFeature(String featureId, boolean state)
742        {
743            if (_dom != null) {
744                _dom.setFeature(featureId, state);
745            }
746        }
747        
748        public void setProperty(String property, Object value)
749        {
750            if (_dom != null) {
751                _dom.setProperty(property, value);
752            }
753        }
754        
755        public DTMAxisTraverser getAxisTraverser(final int axis)
756        {
757            if (_dom != null) {
758                return _dom.getAxisTraverser(axis);
759            }
760            else {
761                return super.getAxisTraverser(axis);
762            }
763        }
764        
765        public boolean hasChildNodes(int nodeHandle)
766        {
767            if (_dom != null) {
768                return _dom.hasChildNodes(nodeHandle);
769            }
770            else {
771                return super.hasChildNodes(nodeHandle);
772            }
773        }
774        
775        public int getFirstChild(int nodeHandle)
776        {
777            if (_dom != null) {
778                return _dom.getFirstChild(nodeHandle);
779            }
780            else {
781                return super.getFirstChild(nodeHandle);
782            }
783        }
784        
785        public int getLastChild(int nodeHandle)
786        {
787            if (_dom != null) {
788                return _dom.getLastChild(nodeHandle);
789            }
790            else {
791                return super.getLastChild(nodeHandle);
792            }
793        }
794        
795        public int getAttributeNode(int elementHandle, String namespaceURI, String name)
796        {
797            if (_dom != null) {
798                return _dom.getAttributeNode(elementHandle, namespaceURI, name);
799            }
800            else {
801                return super.getAttributeNode(elementHandle, namespaceURI, name);
802            }
803        }
804        
805        public int getFirstAttribute(int nodeHandle)
806        {
807            if (_dom != null) {
808                return _dom.getFirstAttribute(nodeHandle);
809            }
810            else {
811                return super.getFirstAttribute(nodeHandle);
812            }
813        }
814        
815        public int getFirstNamespaceNode(int nodeHandle, boolean inScope)
816        {
817            if (_dom != null) {
818                return _dom.getFirstNamespaceNode(nodeHandle, inScope);
819            }
820            else {
821                return super.getFirstNamespaceNode(nodeHandle, inScope);
822            }
823        }
824        
825        public int getNextSibling(int nodeHandle)
826        {
827            if (_dom != null) {
828                return _dom.getNextSibling(nodeHandle);
829            }
830            else {
831                return super.getNextSibling(nodeHandle);
832            }
833         }
834        
835        public int getPreviousSibling(int nodeHandle)
836        {
837            if (_dom != null) {
838                return _dom.getPreviousSibling(nodeHandle);
839            }
840            else {
841                return super.getPreviousSibling(nodeHandle);
842            }
843         }
844        
845        public int getNextAttribute(int nodeHandle)
846        {
847            if (_dom != null) {
848                return _dom.getNextAttribute(nodeHandle);
849            }
850            else {
851                return super.getNextAttribute(nodeHandle);
852            }
853        }
854        
855        public int getNextNamespaceNode(int baseHandle, int namespaceHandle,
856                                      boolean inScope)
857        {
858            if (_dom != null) {
859                return _dom.getNextNamespaceNode(baseHandle, namespaceHandle, inScope);
860            }
861            else {
862                return super.getNextNamespaceNode(baseHandle, namespaceHandle, inScope);
863            }
864        }
865        
866        public int getOwnerDocument(int nodeHandle)
867        {
868            if (_dom != null) {
869                return _dom.getOwnerDocument(nodeHandle);
870            }
871            else {
872                return super.getOwnerDocument(nodeHandle);
873            }
874        }
875        
876        public int getDocumentRoot(int nodeHandle)
877        {
878            if (_dom != null) {
879                return _dom.getDocumentRoot(nodeHandle);
880            }
881            else {
882                return super.getDocumentRoot(nodeHandle);
883            }
884        }
885        
886        public XMLString getStringValue(int nodeHandle)
887        {
888            if (_dom != null) {
889                return _dom.getStringValue(nodeHandle);
890            }
891            else {
892                return super.getStringValue(nodeHandle);
893            }
894        }
895        
896        public int getStringValueChunkCount(int nodeHandle)
897        {
898            if (_dom != null) {
899                return _dom.getStringValueChunkCount(nodeHandle);
900            }
901            else {
902                return super.getStringValueChunkCount(nodeHandle);
903            }
904        }
905        
906        public char[] getStringValueChunk(int nodeHandle, int chunkIndex,
907                                        int[] startAndLen)
908        {
909            if (_dom != null) {
910                return _dom.getStringValueChunk(nodeHandle, chunkIndex, startAndLen);
911            }
912            else {
913                return super.getStringValueChunk(nodeHandle, chunkIndex, startAndLen);
914            }
915        }
916        
917        public int getExpandedTypeID(String namespace, String localName, int type)
918        {
919            if (_dom != null) {
920                return _dom.getExpandedTypeID(namespace, localName, type);
921            }
922            else {
923                return super.getExpandedTypeID(namespace, localName, type);
924            }
925        }
926        
927        public String getLocalNameFromExpandedNameID(int ExpandedNameID)
928        {
929            if (_dom != null) {
930                return _dom.getLocalNameFromExpandedNameID(ExpandedNameID);
931            }
932            else {
933                return super.getLocalNameFromExpandedNameID(ExpandedNameID);
934            }
935        }
936        
937        public String getNamespaceFromExpandedNameID(int ExpandedNameID)
938        {
939            if (_dom != null) {
940                return _dom.getNamespaceFromExpandedNameID(ExpandedNameID);
941            }
942            else {
943                return super.getNamespaceFromExpandedNameID(ExpandedNameID);
944            }
945        }
946        
947        public String getLocalName(int nodeHandle)
948        {
949            if (_dom != null) {
950                return _dom.getLocalName(nodeHandle);
951            }
952            else {
953                return super.getLocalName(nodeHandle);
954            }
955        }
956        
957        public String getPrefix(int nodeHandle)
958        {
959            if (_dom != null) {
960                return _dom.getPrefix(nodeHandle);
961            }
962            else {
963                return super.getPrefix(nodeHandle);
964            }
965        }
966        
967        public String getNamespaceURI(int nodeHandle)
968        {
969            if (_dom != null) {
970                return _dom.getNamespaceURI(nodeHandle);
971            }
972            else {
973                return super.getNamespaceURI(nodeHandle);
974            }
975        }
976        
977        public String getNodeValue(int nodeHandle)
978        {
979            if (_dom != null) {
980                return _dom.getNodeValue(nodeHandle);
981            }
982            else {
983                return super.getNodeValue(nodeHandle);
984            }
985        }
986        
987        public short getNodeType(int nodeHandle)
988        {
989            if (_dom != null) {
990                return _dom.getNodeType(nodeHandle);
991            }
992            else {
993                return super.getNodeType(nodeHandle);
994            }
995        }
996        
997        public short getLevel(int nodeHandle)
998        {
999            if (_dom != null) {
1000                return _dom.getLevel(nodeHandle);
1001            }
1002            else {
1003                return super.getLevel(nodeHandle);
1004            }
1005        }
1006        
1007        public boolean isSupported(String feature, String version)
1008        {
1009            if (_dom != null) {
1010                return _dom.isSupported(feature, version);
1011            }
1012            else {
1013                return super.isSupported(feature, version);
1014            }
1015        }
1016        
1017        public String getDocumentBaseURI()
1018        {
1019            if (_dom != null) {
1020                return _dom.getDocumentBaseURI();
1021            }
1022            else {
1023                return super.getDocumentBaseURI();
1024            }
1025        }
1026        
1027        public void setDocumentBaseURI(String baseURI)
1028        {
1029            if (_dom != null) {
1030                _dom.setDocumentBaseURI(baseURI);
1031            }
1032            else {
1033                super.setDocumentBaseURI(baseURI);
1034            }
1035        }
1036        
1037        public String getDocumentSystemIdentifier(int nodeHandle)
1038        {
1039            if (_dom != null) {
1040                return _dom.getDocumentSystemIdentifier(nodeHandle);
1041            }
1042            else {
1043                return super.getDocumentSystemIdentifier(nodeHandle);
1044            }
1045        }
1046        
1047        public String getDocumentEncoding(int nodeHandle)
1048        {
1049            if (_dom != null) {
1050                return _dom.getDocumentEncoding(nodeHandle);
1051            }
1052            else {
1053                return super.getDocumentEncoding(nodeHandle);
1054            }
1055        }
1056        
1057        public String getDocumentStandalone(int nodeHandle)
1058        {
1059            if (_dom != null) {
1060                return _dom.getDocumentStandalone(nodeHandle);
1061            }
1062            else {
1063                return super.getDocumentStandalone(nodeHandle);
1064            }
1065        }
1066        
1067        public String getDocumentVersion(int documentHandle)
1068        {
1069            if (_dom != null) {
1070                return _dom.getDocumentVersion(documentHandle);
1071            }
1072            else {
1073                return super.getDocumentVersion(documentHandle);
1074            }
1075        }
1076        
1077        public boolean getDocumentAllDeclarationsProcessed()
1078        {
1079            if (_dom != null) {
1080                return _dom.getDocumentAllDeclarationsProcessed();
1081            }
1082            else {
1083                return super.getDocumentAllDeclarationsProcessed();
1084            }
1085        }
1086        
1087        public String getDocumentTypeDeclarationSystemIdentifier()
1088        {
1089            if (_dom != null) {
1090                return _dom.getDocumentTypeDeclarationSystemIdentifier();
1091            }
1092            else {
1093                return super.getDocumentTypeDeclarationSystemIdentifier();
1094            }
1095        }
1096        
1097        public String getDocumentTypeDeclarationPublicIdentifier()
1098        {
1099            if (_dom != null) {
1100                return _dom.getDocumentTypeDeclarationPublicIdentifier();
1101            }
1102            else {
1103                return super.getDocumentTypeDeclarationPublicIdentifier();
1104            }
1105        }
1106        
1107        public int getElementById(String elementId)
1108        {
1109            if (_dom != null) {
1110                return _dom.getElementById(elementId);
1111            }
1112            else {
1113                return super.getElementById(elementId);
1114            }
1115        }
1116            
1117        public boolean supportsPreStripping()
1118        {
1119            if (_dom != null) {
1120                return _dom.supportsPreStripping();
1121            }
1122            else {
1123                return super.supportsPreStripping();
1124            }
1125        }
1126        
1127        public boolean isNodeAfter(int firstNodeHandle, int secondNodeHandle)
1128        {
1129            if (_dom != null) {
1130                return _dom.isNodeAfter(firstNodeHandle, secondNodeHandle);
1131            }
1132            else {
1133                return super.isNodeAfter(firstNodeHandle, secondNodeHandle);
1134            }
1135        }
1136        
1137        public boolean isCharacterElementContentWhitespace(int nodeHandle)
1138        {
1139            if (_dom != null) {
1140                return _dom.isCharacterElementContentWhitespace(nodeHandle);
1141            }
1142            else {
1143                return super.isCharacterElementContentWhitespace(nodeHandle);
1144            }
1145        }
1146        
1147        public boolean isDocumentAllDeclarationsProcessed(int documentHandle)
1148        {
1149            if (_dom != null) {
1150                return _dom.isDocumentAllDeclarationsProcessed(documentHandle);
1151            }
1152            else {
1153                return super.isDocumentAllDeclarationsProcessed(documentHandle);
1154            }
1155        }
1156        
1157        public boolean isAttributeSpecified(int attributeHandle)
1158        {
1159            if (_dom != null) {
1160                return _dom.isAttributeSpecified(attributeHandle);
1161            }
1162            else {
1163                return super.isAttributeSpecified(attributeHandle);
1164            }
1165        }
1166        
1167        public void dispatchCharactersEvents(int nodeHandle, org.xml.sax.ContentHandler ch,
1168                                             boolean normalize)
1169              throws org.xml.sax.SAXException
1170        {
1171            if (_dom != null) {
1172                _dom.dispatchCharactersEvents(nodeHandle,  ch, normalize);
1173            }
1174            else {
1175                super.dispatchCharactersEvents(nodeHandle, ch, normalize);
1176            }
1177        }
1178        
1179        public void dispatchToEvents(int nodeHandle, org.xml.sax.ContentHandler ch)
1180          throws org.xml.sax.SAXException
1181        {
1182            if (_dom != null) {
1183                _dom.dispatchToEvents(nodeHandle,  ch);
1184            }
1185            else {
1186                super.dispatchToEvents(nodeHandle, ch);
1187            }
1188        }
1189        
1190        public org.w3c.dom.Node getNode(int nodeHandle)
1191        {
1192            if (_dom != null) {
1193                return _dom.getNode(nodeHandle);
1194            }
1195            else {
1196                return super.getNode(nodeHandle);
1197            }
1198        }
1199        
1200        public boolean needsTwoThreads()
1201        {
1202            if (_dom != null) {
1203                return _dom.needsTwoThreads();
1204            }
1205            else {
1206                return super.needsTwoThreads();
1207            }
1208        }
1209        
1210        public org.xml.sax.ContentHandler getContentHandler()
1211        {
1212            if (_dom != null) {
1213                return _dom.getContentHandler();
1214            }
1215            else {
1216                return super.getContentHandler();
1217            }
1218        }
1219        
1220        public org.xml.sax.ext.LexicalHandler getLexicalHandler()
1221        {
1222            if (_dom != null) {
1223                return _dom.getLexicalHandler();
1224            }
1225            else {
1226                return super.getLexicalHandler();
1227            }
1228        }
1229        
1230        public org.xml.sax.EntityResolver getEntityResolver()
1231        {
1232            if (_dom != null) {
1233                return _dom.getEntityResolver();
1234            }
1235            else {
1236                return super.getEntityResolver();
1237            }
1238        }
1239        
1240        public org.xml.sax.DTDHandler getDTDHandler()
1241        {
1242            if (_dom != null) {
1243                return _dom.getDTDHandler();
1244            }
1245            else {
1246                return super.getDTDHandler();
1247            }
1248        }
1249        
1250        public org.xml.sax.ErrorHandler getErrorHandler()
1251        {
1252            if (_dom != null) {
1253                return _dom.getErrorHandler();
1254            }
1255            else {
1256                return super.getErrorHandler();
1257            }
1258        }
1259        
1260        public org.xml.sax.ext.DeclHandler getDeclHandler()
1261        {
1262            if (_dom != null) {
1263                return _dom.getDeclHandler();
1264            }
1265            else {
1266                return super.getDeclHandler();
1267            }
1268        }
1269        
1270        public void appendChild(int newChild, boolean clone, boolean cloneDepth)
1271        {
1272            if (_dom != null) {
1273                _dom.appendChild(newChild, clone, cloneDepth);
1274            }
1275            else {
1276                super.appendChild(newChild, clone, cloneDepth);
1277            }
1278        }
1279        
1280        public void appendTextChild(String str)
1281        {
1282            if (_dom != null) {
1283                _dom.appendTextChild(str);
1284            }
1285            else {
1286                super.appendTextChild(str);
1287            }
1288        }
1289        
1290        public SourceLocator getSourceLocatorFor(int node)
1291        {
1292            if (_dom != null) {
1293                return _dom.getSourceLocatorFor(node);
1294            }
1295            else {
1296                return super.getSourceLocatorFor(node);
1297            }
1298        }
1299        
1300        public void documentRegistration()
1301        {
1302            if (_dom != null) {
1303                _dom.documentRegistration();
1304            }
1305            else {
1306                super.documentRegistration();
1307            }
1308        }
1309        
1310        public void documentRelease()
1311        {
1312            if (_dom != null) {
1313                _dom.documentRelease();
1314            }
1315            else {
1316                super.documentRelease();
1317            }
1318        }
1319    
1320    }