1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements. See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership. The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the  "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 /*
19  * $Id: NodeTest.java 468655 2006-10-28 07:12:06Z minchau $
20  */
21 package org.apache.xpath.patterns;
22 
23 import org.apache.xml.dtm.DTM;
24 import org.apache.xml.dtm.DTMFilter;
25 import org.apache.xpath.Expression;
26 import org.apache.xpath.ExpressionOwner;
27 import org.apache.xpath.XPath;
28 import org.apache.xpath.XPathContext;
29 import org.apache.xpath.XPathVisitor;
30 import org.apache.xpath.objects.XNumber;
31 import org.apache.xpath.objects.XObject;
32 
33 /**
34  * This is the basic node test class for both match patterns and location path
35  * steps.
36  * @xsl.usage advanced
37  */
38 public class NodeTest extends Expression
39 {
40     static final long serialVersionUID = -5736721866747906182L;
41 
42   /**
43    * The namespace or local name for node tests with a wildcard.
44    *  @see <a href="http://www.w3.org/TR/xpath#NT-NameTest">the XPath NameTest production.</a>
45    */
46   public static final String WILD = "*";
47 
48   /**
49    * The URL to pass to the Node#supports method, to see if the
50    * DOM has already been stripped of whitespace nodes.
51    */
52   public static final String SUPPORTS_PRE_STRIPPING =
53     "http://xml.apache.org/xpath/features/whitespace-pre-stripping";
54 
55   /**
56    * This attribute determines which node types are accepted.
57    * @serial
58    */
59   protected int m_whatToShow;
60 
61   /**
62    * Special bitmap for match patterns starting with a function.
63    * Make sure this does not conflict with {@link org.w3c.dom.traversal.NodeFilter}.
64    */
65   public static final int SHOW_BYFUNCTION = 0x00010000;
66 
67   /**
68    * This attribute determines which node types are accepted.
69    * These constants are defined in the {@link org.w3c.dom.traversal.NodeFilter}
70    * interface.
71    *
72    * @return bitset mainly defined in {@link org.w3c.dom.traversal.NodeFilter}.
73    */
getWhatToShow()74   public int getWhatToShow()
75   {
76     return m_whatToShow;
77   }
78 
79   /**
80    * This attribute determines which node types are accepted.
81    * These constants are defined in the {@link org.w3c.dom.traversal.NodeFilter}
82    * interface.
83    *
84    * @param what bitset mainly defined in {@link org.w3c.dom.traversal.NodeFilter}.
85    */
setWhatToShow(int what)86   public void setWhatToShow(int what)
87   {
88     m_whatToShow = what;
89   }
90 
91   /**
92    * The namespace to be tested for, which may be null.
93    *  @serial
94    */
95   String m_namespace;
96 
97   /**
98    * Return the namespace to be tested.
99    *
100    * @return The namespace to be tested for, or {@link #WILD}, or null.
101    */
getNamespace()102   public String getNamespace()
103   {
104     return m_namespace;
105   }
106 
107   /**
108    * Set the namespace to be tested.
109    *
110    * @param ns The namespace to be tested for, or {@link #WILD}, or null.
111    */
setNamespace(String ns)112   public void setNamespace(String ns)
113   {
114     m_namespace = ns;
115   }
116 
117   /**
118    * The local name to be tested for.
119    *  @serial
120    */
121   protected String m_name;
122 
123   /**
124    * Return the local name to be tested.
125    *
126    * @return the local name to be tested, or {@link #WILD}, or an empty string.
127    */
getLocalName()128   public String getLocalName()
129   {
130     return (null == m_name) ? "" : m_name;
131   }
132 
133   /**
134    * Set the local name to be tested.
135    *
136    * @param name the local name to be tested, or {@link #WILD}, or an empty string.
137    */
setLocalName(String name)138   public void setLocalName(String name)
139   {
140     m_name = name;
141   }
142 
143   /**
144    * Statically calculated score for this test.  One of
145    *  {@link #SCORE_NODETEST},
146    *  {@link #SCORE_NONE},
147    *  {@link #SCORE_NSWILD},
148    *  {@link #SCORE_QNAME}, or
149    *  {@link #SCORE_OTHER}.
150    *  @serial
151    */
152   XNumber m_score;
153 
154   /**
155    * The match score if the pattern consists of just a NodeTest.
156    *  @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
157    */
158   public static final XNumber SCORE_NODETEST =
159     new XNumber(XPath.MATCH_SCORE_NODETEST);
160 
161   /**
162    * The match score if the pattern pattern has the form NCName:*.
163    *  @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
164    */
165   public static final XNumber SCORE_NSWILD =
166     new XNumber(XPath.MATCH_SCORE_NSWILD);
167 
168   /**
169    * The match score if the pattern has the form
170    * of a QName optionally preceded by an @ character.
171    *  @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
172    */
173   public static final XNumber SCORE_QNAME =
174     new XNumber(XPath.MATCH_SCORE_QNAME);
175 
176   /**
177    * The match score if the pattern consists of something
178    * other than just a NodeTest or just a qname.
179    *  @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
180    */
181   public static final XNumber SCORE_OTHER =
182     new XNumber(XPath.MATCH_SCORE_OTHER);
183 
184   /**
185    * The match score if no match is made.
186    *  @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
187    */
188   public static final XNumber SCORE_NONE =
189     new XNumber(XPath.MATCH_SCORE_NONE);
190 
191   /**
192    * Construct an NodeTest that tests for namespaces and node names.
193    *
194    *
195    * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
196    * @param namespace The namespace to be tested.
197    * @param name The local name to be tested.
198    */
NodeTest(int whatToShow, String namespace, String name)199   public NodeTest(int whatToShow, String namespace, String name)
200   {
201     initNodeTest(whatToShow, namespace, name);
202   }
203 
204   /**
205    * Construct an NodeTest that doesn't test for node names.
206    *
207    *
208    * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
209    */
NodeTest(int whatToShow)210   public NodeTest(int whatToShow)
211   {
212     initNodeTest(whatToShow);
213   }
214 
215   /**
216    * @see Expression#deepEquals(Expression)
217    */
deepEquals(Expression expr)218   public boolean deepEquals(Expression expr)
219   {
220   	if(!isSameClass(expr))
221   		return false;
222 
223   	NodeTest nt = (NodeTest)expr;
224 
225   	if(null != nt.m_name)
226   	{
227   		if(null == m_name)
228   			return false;
229   		else if(!nt.m_name.equals(m_name))
230   			return false;
231   	}
232   	else if(null != m_name)
233   		return false;
234 
235   	if(null != nt.m_namespace)
236   	{
237   		if(null == m_namespace)
238   			return false;
239   		else if(!nt.m_namespace.equals(m_namespace))
240   			return false;
241   	}
242   	else if(null != m_namespace)
243   		return false;
244 
245   	if(m_whatToShow != nt.m_whatToShow)
246   		return false;
247 
248   	if(m_isTotallyWild != nt.m_isTotallyWild)
249   		return false;
250 
251 	return true;
252   }
253 
254   /**
255    * Null argument constructor.
256    */
NodeTest()257   public NodeTest(){}
258 
259   /**
260    * Initialize this node test by setting the whatToShow property, and
261    * calculating the score that this test will return if a test succeeds.
262    *
263    *
264    * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
265    */
initNodeTest(int whatToShow)266   public void initNodeTest(int whatToShow)
267   {
268 
269     m_whatToShow = whatToShow;
270 
271     calcScore();
272   }
273 
274   /**
275    * Initialize this node test by setting the whatToShow property and the
276    * namespace and local name, and
277    * calculating the score that this test will return if a test succeeds.
278    *
279    *
280    * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
281    * @param namespace The namespace to be tested.
282    * @param name The local name to be tested.
283    */
initNodeTest(int whatToShow, String namespace, String name)284   public void initNodeTest(int whatToShow, String namespace, String name)
285   {
286 
287     m_whatToShow = whatToShow;
288     m_namespace = namespace;
289     m_name = name;
290 
291     calcScore();
292   }
293 
294   /**
295    * True if this test has a null namespace and a local name of {@link #WILD}.
296    *  @serial
297    */
298   private boolean m_isTotallyWild;
299 
300   /**
301    * Get the static score for this node test.
302    * @return Should be one of the SCORE_XXX constants.
303    */
getStaticScore()304   public XNumber getStaticScore()
305   {
306     return m_score;
307   }
308 
309   /**
310    * Set the static score for this node test.
311    * @param score Should be one of the SCORE_XXX constants.
312    */
setStaticScore(XNumber score)313   public void setStaticScore(XNumber score)
314   {
315     m_score = score;
316   }
317 
318   /**
319    * Static calc of match score.
320    */
calcScore()321   protected void calcScore()
322   {
323 
324     if ((m_namespace == null) && (m_name == null))
325       m_score = SCORE_NODETEST;
326     else if (((m_namespace == WILD) || (m_namespace == null))
327              && (m_name == WILD))
328       m_score = SCORE_NODETEST;
329     else if ((m_namespace != WILD) && (m_name == WILD))
330       m_score = SCORE_NSWILD;
331     else
332       m_score = SCORE_QNAME;
333 
334     m_isTotallyWild = (m_namespace == null && m_name == WILD);
335   }
336 
337   /**
338    * Get the score that this test will return if a test succeeds.
339    *
340    *
341    * @return the score that this test will return if a test succeeds.
342    */
getDefaultScore()343   public double getDefaultScore()
344   {
345     return m_score.num();
346   }
347 
348   /**
349    * Tell what node type to test, if not DTMFilter.SHOW_ALL.
350    *
351    * @param whatToShow Bit set defined mainly by
352    *        {@link org.apache.xml.dtm.DTMFilter}.
353    * @return the node type for the whatToShow.  Since whatToShow can specify
354    *         multiple types, it will return the first bit tested that is on,
355    *         so the caller of this function should take care that this is
356    *         the function they really want to call.  If none of the known bits
357    *         are set, this function will return zero.
358    */
getNodeTypeTest(int whatToShow)359   public static int getNodeTypeTest(int whatToShow)
360   {
361     // %REVIEW% Is there a better way?
362     if (0 != (whatToShow & DTMFilter.SHOW_ELEMENT))
363       return DTM.ELEMENT_NODE;
364 
365     if (0 != (whatToShow & DTMFilter.SHOW_ATTRIBUTE))
366       return DTM.ATTRIBUTE_NODE;
367 
368     if (0 != (whatToShow & DTMFilter.SHOW_TEXT))
369       return DTM.TEXT_NODE;
370 
371     if (0 != (whatToShow & DTMFilter.SHOW_DOCUMENT))
372       return DTM.DOCUMENT_NODE;
373 
374     if (0 != (whatToShow & DTMFilter.SHOW_DOCUMENT_FRAGMENT))
375       return DTM.DOCUMENT_FRAGMENT_NODE;
376 
377     if (0 != (whatToShow & DTMFilter.SHOW_NAMESPACE))
378       return DTM.NAMESPACE_NODE;
379 
380     if (0 != (whatToShow & DTMFilter.SHOW_COMMENT))
381       return DTM.COMMENT_NODE;
382 
383     if (0 != (whatToShow & DTMFilter.SHOW_PROCESSING_INSTRUCTION))
384       return DTM.PROCESSING_INSTRUCTION_NODE;
385 
386     if (0 != (whatToShow & DTMFilter.SHOW_DOCUMENT_TYPE))
387       return DTM.DOCUMENT_TYPE_NODE;
388 
389     if (0 != (whatToShow & DTMFilter.SHOW_ENTITY))
390       return DTM.ENTITY_NODE;
391 
392     if (0 != (whatToShow & DTMFilter.SHOW_ENTITY_REFERENCE))
393       return DTM.ENTITY_REFERENCE_NODE;
394 
395     if (0 != (whatToShow & DTMFilter.SHOW_NOTATION))
396       return DTM.NOTATION_NODE;
397 
398     if (0 != (whatToShow & DTMFilter.SHOW_CDATA_SECTION))
399       return DTM.CDATA_SECTION_NODE;
400 
401 
402     return 0;
403   }
404 
405 
406   /**
407    * Do a diagnostics dump of a whatToShow bit set.
408    *
409    *
410    * @param whatToShow Bit set defined mainly by
411    *        {@link org.apache.xml.dtm.DTMFilter}.
412    */
debugWhatToShow(int whatToShow)413   public static void debugWhatToShow(int whatToShow)
414   {
415 
416     java.util.Vector v = new java.util.Vector();
417 
418     if (0 != (whatToShow & DTMFilter.SHOW_ATTRIBUTE))
419       v.addElement("SHOW_ATTRIBUTE");
420 
421     if (0 != (whatToShow & DTMFilter.SHOW_NAMESPACE))
422       v.addElement("SHOW_NAMESPACE");
423 
424     if (0 != (whatToShow & DTMFilter.SHOW_CDATA_SECTION))
425       v.addElement("SHOW_CDATA_SECTION");
426 
427     if (0 != (whatToShow & DTMFilter.SHOW_COMMENT))
428       v.addElement("SHOW_COMMENT");
429 
430     if (0 != (whatToShow & DTMFilter.SHOW_DOCUMENT))
431       v.addElement("SHOW_DOCUMENT");
432 
433     if (0 != (whatToShow & DTMFilter.SHOW_DOCUMENT_FRAGMENT))
434       v.addElement("SHOW_DOCUMENT_FRAGMENT");
435 
436     if (0 != (whatToShow & DTMFilter.SHOW_DOCUMENT_TYPE))
437       v.addElement("SHOW_DOCUMENT_TYPE");
438 
439     if (0 != (whatToShow & DTMFilter.SHOW_ELEMENT))
440       v.addElement("SHOW_ELEMENT");
441 
442     if (0 != (whatToShow & DTMFilter.SHOW_ENTITY))
443       v.addElement("SHOW_ENTITY");
444 
445     if (0 != (whatToShow & DTMFilter.SHOW_ENTITY_REFERENCE))
446       v.addElement("SHOW_ENTITY_REFERENCE");
447 
448     if (0 != (whatToShow & DTMFilter.SHOW_NOTATION))
449       v.addElement("SHOW_NOTATION");
450 
451     if (0 != (whatToShow & DTMFilter.SHOW_PROCESSING_INSTRUCTION))
452       v.addElement("SHOW_PROCESSING_INSTRUCTION");
453 
454     if (0 != (whatToShow & DTMFilter.SHOW_TEXT))
455       v.addElement("SHOW_TEXT");
456 
457     int n = v.size();
458 
459     for (int i = 0; i < n; i++)
460     {
461       if (i > 0)
462         System.out.print(" | ");
463 
464       System.out.print(v.elementAt(i));
465     }
466 
467     if (0 == n)
468       System.out.print("empty whatToShow: " + whatToShow);
469 
470     System.out.println();
471   }
472 
473   /**
474    * Two names are equal if they and either both are null or
475    * the name t is wild and the name p is non-null, or the two
476    * strings are equal.
477    *
478    * @param p part string from the node.
479    * @param t target string, which may be {@link #WILD}.
480    *
481    * @return true if the strings match according to the rules of this method.
482    */
subPartMatch(String p, String t)483   private static final boolean subPartMatch(String p, String t)
484   {
485 
486     // boolean b = (p == t) || ((null != p) && ((t == WILD) || p.equals(t)));
487     // System.out.println("subPartMatch - p: "+p+", t: "+t+", result: "+b);
488     return (p == t) || ((null != p) && ((t == WILD) || p.equals(t)));
489   }
490 
491   /**
492    * This is temporary to patch over Xerces issue with representing DOM
493    * namespaces as "".
494    *
495    * @param p part string from the node, which may represent the null namespace
496    *        as null or as "".
497    * @param t target string, which may be {@link #WILD}.
498    *
499    * @return true if the strings match according to the rules of this method.
500    */
subPartMatchNS(String p, String t)501   private static final boolean subPartMatchNS(String p, String t)
502   {
503 
504     return (p == t)
505            || ((null != p)
506                && ((p.length() > 0)
507                    ? ((t == WILD) || p.equals(t)) : null == t));
508   }
509 
510   /**
511    * Tell what the test score is for the given node.
512    *
513    *
514    * @param xctxt XPath runtime context.
515    * @param context The node being tested.
516    *
517    * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST},
518    *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE},
519    *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD},
520    *         {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or
521    *         {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}.
522    *
523    * @throws javax.xml.transform.TransformerException
524    */
execute(XPathContext xctxt, int context)525   public XObject execute(XPathContext xctxt, int context)
526           throws javax.xml.transform.TransformerException
527   {
528 
529     DTM dtm = xctxt.getDTM(context);
530     short nodeType = dtm.getNodeType(context);
531 
532     if (m_whatToShow == DTMFilter.SHOW_ALL)
533       return m_score;
534 
535     int nodeBit = (m_whatToShow & (0x00000001 << (nodeType - 1)));
536 
537     switch (nodeBit)
538     {
539     case DTMFilter.SHOW_DOCUMENT_FRAGMENT :
540     case DTMFilter.SHOW_DOCUMENT :
541       return SCORE_OTHER;
542     case DTMFilter.SHOW_COMMENT :
543       return m_score;
544     case DTMFilter.SHOW_CDATA_SECTION :
545     case DTMFilter.SHOW_TEXT :
546 
547       // was:
548       // return (!xctxt.getDOMHelper().shouldStripSourceNode(context))
549       //       ? m_score : SCORE_NONE;
550       return m_score;
551     case DTMFilter.SHOW_PROCESSING_INSTRUCTION :
552       return subPartMatch(dtm.getNodeName(context), m_name)
553              ? m_score : SCORE_NONE;
554 
555     // From the draft: "Two expanded names are equal if they
556     // have the same local part, and either both have no URI or
557     // both have the same URI."
558     // "A node test * is true for any node of the principal node type.
559     // For example, child::* will select all element children of the
560     // context node, and attribute::* will select all attributes of
561     // the context node."
562     // "A node test can have the form NCName:*. In this case, the prefix
563     // is expanded in the same way as with a QName using the context
564     // namespace declarations. The node test will be true for any node
565     // of the principal type whose expanded name has the URI to which
566     // the prefix expands, regardless of the local part of the name."
567     case DTMFilter.SHOW_NAMESPACE :
568     {
569       String ns = dtm.getLocalName(context);
570 
571       return (subPartMatch(ns, m_name)) ? m_score : SCORE_NONE;
572     }
573     case DTMFilter.SHOW_ATTRIBUTE :
574     case DTMFilter.SHOW_ELEMENT :
575     {
576       return (m_isTotallyWild || (subPartMatchNS(dtm.getNamespaceURI(context), m_namespace) && subPartMatch(dtm.getLocalName(context), m_name)))
577              ? m_score : SCORE_NONE;
578     }
579     default :
580       return SCORE_NONE;
581     }  // end switch(testType)
582   }
583 
584   /**
585    * Tell what the test score is for the given node.
586    *
587    *
588    * @param xctxt XPath runtime context.
589    * @param context The node being tested.
590    *
591    * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST},
592    *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE},
593    *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD},
594    *         {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or
595    *         {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}.
596    *
597    * @throws javax.xml.transform.TransformerException
598    */
execute(XPathContext xctxt, int context, DTM dtm, int expType)599   public XObject execute(XPathContext xctxt, int context,
600                          DTM dtm, int expType)
601           throws javax.xml.transform.TransformerException
602   {
603 
604     if (m_whatToShow == DTMFilter.SHOW_ALL)
605       return m_score;
606 
607     int nodeBit = (m_whatToShow & (0x00000001
608                    << ((dtm.getNodeType(context)) - 1)));
609 
610     switch (nodeBit)
611     {
612     case DTMFilter.SHOW_DOCUMENT_FRAGMENT :
613     case DTMFilter.SHOW_DOCUMENT :
614       return SCORE_OTHER;
615     case DTMFilter.SHOW_COMMENT :
616       return m_score;
617     case DTMFilter.SHOW_CDATA_SECTION :
618     case DTMFilter.SHOW_TEXT :
619 
620       // was:
621       // return (!xctxt.getDOMHelper().shouldStripSourceNode(context))
622       //       ? m_score : SCORE_NONE;
623       return m_score;
624     case DTMFilter.SHOW_PROCESSING_INSTRUCTION :
625       return subPartMatch(dtm.getNodeName(context), m_name)
626              ? m_score : SCORE_NONE;
627 
628     // From the draft: "Two expanded names are equal if they
629     // have the same local part, and either both have no URI or
630     // both have the same URI."
631     // "A node test * is true for any node of the principal node type.
632     // For example, child::* will select all element children of the
633     // context node, and attribute::* will select all attributes of
634     // the context node."
635     // "A node test can have the form NCName:*. In this case, the prefix
636     // is expanded in the same way as with a QName using the context
637     // namespace declarations. The node test will be true for any node
638     // of the principal type whose expanded name has the URI to which
639     // the prefix expands, regardless of the local part of the name."
640     case DTMFilter.SHOW_NAMESPACE :
641     {
642       String ns = dtm.getLocalName(context);
643 
644       return (subPartMatch(ns, m_name)) ? m_score : SCORE_NONE;
645     }
646     case DTMFilter.SHOW_ATTRIBUTE :
647     case DTMFilter.SHOW_ELEMENT :
648     {
649       return (m_isTotallyWild || (subPartMatchNS(dtm.getNamespaceURI(context), m_namespace) && subPartMatch(dtm.getLocalName(context), m_name)))
650              ? m_score : SCORE_NONE;
651     }
652     default :
653       return SCORE_NONE;
654     }  // end switch(testType)
655   }
656 
657   /**
658    * Test the current node to see if it matches the given node test.
659    *
660    * @param xctxt XPath runtime context.
661    *
662    * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST},
663    *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE},
664    *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD},
665    *         {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or
666    *         {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}.
667    *
668    * @throws javax.xml.transform.TransformerException
669    */
execute(XPathContext xctxt)670   public XObject execute(XPathContext xctxt)
671           throws javax.xml.transform.TransformerException
672   {
673     return execute(xctxt, xctxt.getCurrentNode());
674   }
675 
676   /**
677    * Node tests by themselves do not need to fix up variables.
678    */
fixupVariables(java.util.Vector vars, int globalsSize)679   public void fixupVariables(java.util.Vector vars, int globalsSize)
680   {
681     // no-op
682   }
683 
684   /**
685    * @see org.apache.xpath.XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
686    */
callVisitors(ExpressionOwner owner, XPathVisitor visitor)687   public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
688   {
689   	assertion(false, "callVisitors should not be called for this object!!!");
690   }
691 
692 }
693