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: FunctionOneArg.java 468655 2006-10-28 07:12:06Z minchau $ 20 */ 21package org.apache.xpath.functions; 22 23import org.apache.xalan.res.XSLMessages; 24import org.apache.xpath.Expression; 25import org.apache.xpath.ExpressionOwner; 26import org.apache.xpath.XPathVisitor; 27 28/** 29 * Base class for functions that accept one argument. 30 * @xsl.usage advanced 31 */ 32public class FunctionOneArg extends Function implements ExpressionOwner 33{ 34 static final long serialVersionUID = -5180174180765609758L; 35 36 /** The first argument passed to the function (at index 0). 37 * @serial */ 38 Expression m_arg0; 39 40 /** 41 * Return the first argument passed to the function (at index 0). 42 * 43 * @return An expression that represents the first argument passed to the 44 * function. 45 */ 46 public Expression getArg0() 47 { 48 return m_arg0; 49 } 50 51 /** 52 * Set an argument expression for a function. This method is called by the 53 * XPath compiler. 54 * 55 * @param arg non-null expression that represents the argument. 56 * @param argNum The argument number index. 57 * 58 * @throws WrongNumberArgsException If the argNum parameter is greater than 0. 59 */ 60 public void setArg(Expression arg, int argNum) 61 throws WrongNumberArgsException 62 { 63 64 if (0 == argNum) 65 { 66 m_arg0 = arg; 67 arg.exprSetParent(this); 68 } 69 else 70 reportWrongNumberArgs(); 71 } 72 73 /** 74 * Check that the number of arguments passed to this function is correct. 75 * 76 * 77 * @param argNum The number of arguments that is being passed to the function. 78 * 79 * @throws WrongNumberArgsException 80 */ 81 public void checkNumberArgs(int argNum) throws WrongNumberArgsException 82 { 83 if (argNum != 1) 84 reportWrongNumberArgs(); 85 } 86 87 /** 88 * Constructs and throws a WrongNumberArgException with the appropriate 89 * message for this function object. 90 * 91 * @throws WrongNumberArgsException 92 */ 93 protected void reportWrongNumberArgs() throws WrongNumberArgsException { 94 throw new WrongNumberArgsException(XSLMessages.createXPATHMessage("one", null)); 95 } 96 97 /** 98 * Tell if this expression or it's subexpressions can traverse outside 99 * the current subtree. 100 * 101 * @return true if traversal outside the context node's subtree can occur. 102 */ 103 public boolean canTraverseOutsideSubtree() 104 { 105 return m_arg0.canTraverseOutsideSubtree(); 106 } 107 108 /** 109 * This function is used to fixup variables from QNames to stack frame 110 * indexes at stylesheet build time. 111 * @param vars List of QNames that correspond to variables. This list 112 * should be searched backwards for the first qualified name that 113 * corresponds to the variable reference qname. The position of the 114 * QName in the vector from the start of the vector will be its position 115 * in the stack frame (but variables above the globalsTop value will need 116 * to be offset to the current stack frame). 117 */ 118 public void fixupVariables(java.util.Vector vars, int globalsSize) 119 { 120 if(null != m_arg0) 121 m_arg0.fixupVariables(vars, globalsSize); 122 } 123 124 /** 125 * @see org.apache.xpath.XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor) 126 */ 127 public void callArgVisitors(XPathVisitor visitor) 128 { 129 if(null != m_arg0) 130 m_arg0.callVisitors(this, visitor); 131 } 132 133 134 /** 135 * @see ExpressionOwner#getExpression() 136 */ 137 public Expression getExpression() 138 { 139 return m_arg0; 140 } 141 142 /** 143 * @see ExpressionOwner#setExpression(Expression) 144 */ 145 public void setExpression(Expression exp) 146 { 147 exp.exprSetParent(this); 148 m_arg0 = exp; 149 } 150 151 /** 152 * @see Expression#deepEquals(Expression) 153 */ 154 public boolean deepEquals(Expression expr) 155 { 156 if(!super.deepEquals(expr)) 157 return false; 158 159 if(null != m_arg0) 160 { 161 if(null == ((FunctionOneArg)expr).m_arg0) 162 return false; 163 164 if(!m_arg0.deepEquals(((FunctionOneArg)expr).m_arg0)) 165 return false; 166 } 167 else if(null != ((FunctionOneArg)expr).m_arg0) 168 return false; 169 170 return true; 171 } 172 173 174} 175