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: Arg.java 468655 2006-10-28 07:12:06Z minchau $ 20 */ 21 package org.apache.xpath; 22 23 import org.apache.xml.utils.QName; 24 import org.apache.xpath.objects.XObject; 25 26 /** 27 * This class holds an instance of an argument on 28 * the stack. The value of the argument can be either an 29 * XObject or a String containing an expression. 30 * @xsl.usage internal 31 */ 32 public class Arg 33 { 34 35 /** Field m_qname: The name of this argument, expressed as a QName 36 * (Qualified Name) object. 37 * @see getQName 38 * @see setQName 39 * */ 40 private QName m_qname; 41 42 /** 43 * Get the qualified name for this argument. 44 * 45 * @return QName object containing the qualified name 46 */ 47 public final QName getQName() 48 { 49 return m_qname; 50 } 51 52 /** 53 * Set the qualified name for this argument. 54 * 55 * @param name QName object representing the new Qualified Name. 56 */ 57 public final void setQName(QName name) 58 { 59 m_qname = name; 60 } 61 62 /** Field m_val: Stored XObject value of this argument 63 * @see #getVal() 64 * @see #setVal() 65 */ 66 private XObject m_val; 67 68 /** 69 * Get the value for this argument. 70 * 71 * @return the argument's stored XObject value. 72 * @see #setVal(XObject) 73 */ 74 public final XObject getVal() 75 { 76 return m_val; 77 } 78 79 /** 80 * Set the value of this argument. 81 * 82 * @param val an XObject representing the arguments's value. 83 * @see #getVal() 84 */ 85 public final void setVal(XObject val) 86 { 87 m_val = val; 88 } 89 90 /** 91 * Have the object release it's resources. 92 * Call only when the variable or argument is going out of scope. 93 */ 94 public void detach() 95 { 96 if(null != m_val) 97 { 98 m_val.allowDetachToRelease(true); 99 m_val.detach(); 100 } 101 } 102 103 104 /** Field m_expression: Stored expression value of this argument. 105 * @see #setExpression 106 * @see #getExpression 107 * */ 108 private String m_expression; 109 110 /** 111 * Get the value expression for this argument. 112 * 113 * @return String containing the expression previously stored into this 114 * argument 115 * @see #setExpression 116 */ 117 public String getExpression() 118 { 119 return m_expression; 120 } 121 122 /** 123 * Set the value expression for this argument. 124 * 125 * @param expr String containing the expression to be stored as this 126 * argument's value. 127 * @see #getExpression 128 */ 129 public void setExpression(String expr) 130 { 131 m_expression = expr; 132 } 133 134 /** 135 * True if this variable was added with an xsl:with-param or 136 * is added via setParameter. 137 */ 138 private boolean m_isFromWithParam; 139 140 /** 141 * Tell if this variable is a parameter passed with a with-param or as 142 * a top-level parameter. 143 */ 144 public boolean isFromWithParam() 145 { 146 return m_isFromWithParam; 147 } 148 149 /** 150 * True if this variable is currently visible. To be visible, 151 * a variable needs to come either from xsl:variable or be 152 * a "received" parameter, ie one for which an xsl:param has 153 * been encountered. 154 * Set at the time the object is constructed and updated as needed. 155 */ 156 private boolean m_isVisible; 157 158 /** 159 * Tell if this variable is currently visible. 160 */ 161 public boolean isVisible() 162 { 163 return m_isVisible; 164 } 165 166 /** 167 * Update visibility status of this variable. 168 */ 169 public void setIsVisible(boolean b) 170 { 171 m_isVisible = b; 172 } 173 174 /** 175 * Construct a dummy parameter argument, with no QName and no 176 * value (either expression string or value XObject). isVisible 177 * defaults to true. 178 */ 179 public Arg() 180 { 181 182 m_qname = new QName(""); 183 ; // so that string compares can be done. 184 m_val = null; 185 m_expression = null; 186 m_isVisible = true; 187 m_isFromWithParam = false; 188 } 189 190 /** 191 * Construct a parameter argument that contains an expression. 192 * 193 * @param qname Name of the argument, expressed as a QName object. 194 * @param expression String to be stored as this argument's value expression. 195 * @param isFromWithParam True if this is a parameter variable. 196 */ 197 public Arg(QName qname, String expression, boolean isFromWithParam) 198 { 199 200 m_qname = qname; 201 m_val = null; 202 m_expression = expression; 203 m_isFromWithParam = isFromWithParam; 204 m_isVisible = !isFromWithParam; 205 } 206 207 /** 208 * Construct a parameter argument which has an XObject value. 209 * isVisible defaults to true. 210 * 211 * @param qname Name of the argument, expressed as a QName object. 212 * @param val Value of the argument, expressed as an XObject 213 */ 214 public Arg(QName qname, XObject val) 215 { 216 217 m_qname = qname; 218 m_val = val; 219 m_isVisible = true; 220 m_isFromWithParam = false; 221 m_expression = null; 222 } 223 224 /** 225 * Equality function specialized for the variable name. If the argument 226 * is not a qname, it will deligate to the super class. 227 * 228 * @param obj the reference object with which to compare. 229 * @return <code>true</code> if this object is the same as the obj 230 * argument; <code>false</code> otherwise. 231 */ 232 public boolean equals(Object obj) 233 { 234 if(obj instanceof QName) 235 { 236 return m_qname.equals(obj); 237 } 238 else 239 return super.equals(obj); 240 } 241 242 /** 243 * Construct a parameter argument. 244 * 245 * @param qname Name of the argument, expressed as a QName object. 246 * @param val Value of the argument, expressed as an XObject 247 * @param isFromWithParam True if this is a parameter variable. 248 */ 249 public Arg(QName qname, XObject val, boolean isFromWithParam) 250 { 251 252 m_qname = qname; 253 m_val = val; 254 m_isFromWithParam = isFromWithParam; 255 m_isVisible = !isFromWithParam; 256 m_expression = null; 257 } 258 } 259