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: Arg.java 468655 2006-10-28 07:12:06Z minchau $ 020 */ 021 package org.apache.xpath; 022 023 import org.apache.xml.utils.QName; 024 import org.apache.xpath.objects.XObject; 025 026 /** 027 * This class holds an instance of an argument on 028 * the stack. The value of the argument can be either an 029 * XObject or a String containing an expression. 030 * @xsl.usage internal 031 */ 032 public class Arg 033 { 034 035 /** Field m_qname: The name of this argument, expressed as a QName 036 * (Qualified Name) object. 037 * @see getQName 038 * @see setQName 039 * */ 040 private QName m_qname; 041 042 /** 043 * Get the qualified name for this argument. 044 * 045 * @return QName object containing the qualified name 046 */ 047 public final QName getQName() 048 { 049 return m_qname; 050 } 051 052 /** 053 * Set the qualified name for this argument. 054 * 055 * @param name QName object representing the new Qualified Name. 056 */ 057 public final void setQName(QName name) 058 { 059 m_qname = name; 060 } 061 062 /** Field m_val: Stored XObject value of this argument 063 * @see #getVal() 064 * @see #setVal() 065 */ 066 private XObject m_val; 067 068 /** 069 * Get the value for this argument. 070 * 071 * @return the argument's stored XObject value. 072 * @see #setVal(XObject) 073 */ 074 public final XObject getVal() 075 { 076 return m_val; 077 } 078 079 /** 080 * Set the value of this argument. 081 * 082 * @param val an XObject representing the arguments's value. 083 * @see #getVal() 084 */ 085 public final void setVal(XObject val) 086 { 087 m_val = val; 088 } 089 090 /** 091 * Have the object release it's resources. 092 * Call only when the variable or argument is going out of scope. 093 */ 094 public void detach() 095 { 096 if(null != m_val) 097 { 098 m_val.allowDetachToRelease(true); 099 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 }