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: Function3Args.java,v 1.16 2005/01/23 01:08:21 mcnamara Exp $
018: */
019: package org.apache.xpath.functions;
020:
021: import org.apache.xalan.res.XSLMessages;
022: import org.apache.xpath.Expression;
023: import org.apache.xpath.ExpressionOwner;
024: import org.apache.xpath.XPathVisitor;
025:
026: /**
027: * Base class for functions that accept three arguments.
028: * @xsl.usage advanced
029: */
030: public class Function3Args extends Function2Args {
031: static final long serialVersionUID = 7915240747161506646L;
032:
033: /** The third argument passed to the function (at index 2).
034: * @serial */
035: Expression m_arg2;
036:
037: /**
038: * Return the third argument passed to the function (at index 2).
039: *
040: * @return An expression that represents the third argument passed to the
041: * function.
042: */
043: public Expression getArg2() {
044: return m_arg2;
045: }
046:
047: /**
048: * This function is used to fixup variables from QNames to stack frame
049: * indexes at stylesheet build time.
050: * @param vars List of QNames that correspond to variables. This list
051: * should be searched backwards for the first qualified name that
052: * corresponds to the variable reference qname. The position of the
053: * QName in the vector from the start of the vector will be its position
054: * in the stack frame (but variables above the globalsTop value will need
055: * to be offset to the current stack frame).
056: */
057: public void fixupVariables(java.util.Vector vars, int globalsSize) {
058: super .fixupVariables(vars, globalsSize);
059: if (null != m_arg2)
060: m_arg2.fixupVariables(vars, globalsSize);
061: }
062:
063: /**
064: * Set an argument expression for a function. This method is called by the
065: * XPath compiler.
066: *
067: * @param arg non-null expression that represents the argument.
068: * @param argNum The argument number index.
069: *
070: * @throws WrongNumberArgsException If the argNum parameter is greater than 2.
071: */
072: public void setArg(Expression arg, int argNum)
073: throws WrongNumberArgsException {
074:
075: if (argNum < 2)
076: super .setArg(arg, argNum);
077: else if (2 == argNum) {
078: m_arg2 = arg;
079: arg.exprSetParent(this );
080: } else
081: reportWrongNumberArgs();
082: }
083:
084: /**
085: * Check that the number of arguments passed to this function is correct.
086: *
087: *
088: * @param argNum The number of arguments that is being passed to the function.
089: *
090: * @throws WrongNumberArgsException
091: */
092: public void checkNumberArgs(int argNum)
093: throws WrongNumberArgsException {
094: if (argNum != 3)
095: reportWrongNumberArgs();
096: }
097:
098: /**
099: * Constructs and throws a WrongNumberArgException with the appropriate
100: * message for this function object.
101: *
102: * @throws WrongNumberArgsException
103: */
104: protected void reportWrongNumberArgs()
105: throws WrongNumberArgsException {
106: throw new WrongNumberArgsException(XSLMessages
107: .createXPATHMessage("three", null));
108: }
109:
110: /**
111: * Tell if this expression or it's subexpressions can traverse outside
112: * the current subtree.
113: *
114: * @return true if traversal outside the context node's subtree can occur.
115: */
116: public boolean canTraverseOutsideSubtree() {
117: return super .canTraverseOutsideSubtree() ? true : m_arg2
118: .canTraverseOutsideSubtree();
119: }
120:
121: class Arg2Owner implements ExpressionOwner {
122: /**
123: * @see ExpressionOwner#getExpression()
124: */
125: public Expression getExpression() {
126: return m_arg2;
127: }
128:
129: /**
130: * @see ExpressionOwner#setExpression(Expression)
131: */
132: public void setExpression(Expression exp) {
133: exp.exprSetParent(Function3Args.this );
134: m_arg2 = exp;
135: }
136: }
137:
138: /**
139: * @see org.apache.xpath.XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
140: */
141: public void callArgVisitors(XPathVisitor visitor) {
142: super .callArgVisitors(visitor);
143: if (null != m_arg2)
144: m_arg2.callVisitors(new Arg2Owner(), visitor);
145: }
146:
147: /**
148: * @see Expression#deepEquals(Expression)
149: */
150: public boolean deepEquals(Expression expr) {
151: if (!super .deepEquals(expr))
152: return false;
153:
154: if (null != m_arg2) {
155: if (null == ((Function3Args) expr).m_arg2)
156: return false;
157:
158: if (!m_arg2.deepEquals(((Function3Args) expr).m_arg2))
159: return false;
160: } else if (null != ((Function3Args) expr).m_arg2)
161: return false;
162:
163: return true;
164: }
165:
166: }
|