/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* $Id: Arg.java 468655 2006-10-28 07:12:06Z minchau $
*/
package org.apache.xpath;
import org.apache.xml.utils.QName;
import org.apache.xpath.objects.XObject;
/**
* This class holds an instance of an argument on
* the stack. The value of the argument can be either an
* XObject or a String containing an expression.
* @xsl.usage internal
*/
public class Arg
{
/** Field m_qname: The name of this argument, expressed as a QName
* (Qualified Name) object.
* @see getQName
* @see setQName
* */
private QName m_qname;
/**
* Get the qualified name for this argument.
*
* @return QName object containing the qualified name
*/
public final QName getQName()
{
return m_qname;
}
/**
* Set the qualified name for this argument.
*
* @param name QName object representing the new Qualified Name.
*/
public final void setQName(QName name)
{
m_qname = name;
}
/** Field m_val: Stored XObject value of this argument
* @see #getVal()
* @see #setVal()
*/
private XObject m_val;
/**
* Get the value for this argument.
*
* @return the argument's stored XObject value.
* @see #setVal(XObject)
*/
public final XObject getVal()
{
return m_val;
}
/**
* Set the value of this argument.
*
* @param val an XObject representing the arguments's value.
* @see #getVal()
*/
public final void setVal(XObject val)
{
m_val = val;
}
/**
* Have the object release it's resources.
* Call only when the variable or argument is going out of scope.
*/
public void detach()
{
if(null != m_val)
{
m_val.allowDetachToRelease(true);
m_val.detach();
}
}
/** Field m_expression: Stored expression value of this argument.
* @see #setExpression
* @see #getExpression
* */
private String m_expression;
/**
* Get the value expression for this argument.
*
* @return String containing the expression previously stored into this
* argument
* @see #setExpression
*/
public String getExpression()
{
return m_expression;
}
/**
* Set the value expression for this argument.
*
* @param expr String containing the expression to be stored as this
* argument's value.
* @see #getExpression
*/
public void setExpression(String expr)
{
m_expression = expr;
}
/**
* True if this variable was added with an xsl:with-param or
* is added via setParameter.
*/
private boolean m_isFromWithParam;
/**
* Tell if this variable is a parameter passed with a with-param or as
* a top-level parameter.
*/
public boolean isFromWithParam()
{
return m_isFromWithParam;
}
/**
* True if this variable is currently visible. To be visible,
* a variable needs to come either from xsl:variable or be
* a "received" parameter, ie one for which an xsl:param has
* been encountered.
* Set at the time the object is constructed and updated as needed.
*/
private boolean m_isVisible;
/**
* Tell if this variable is currently visible.
*/
public boolean isVisible()
{
return m_isVisible;
}
/**
* Update visibility status of this variable.
*/
public void setIsVisible(boolean b)
{
m_isVisible = b;
}
/**
* Construct a dummy parameter argument, with no QName and no
* value (either expression string or value XObject). isVisible
* defaults to true.
*/
public Arg()
{
m_qname = new QName("");
; // so that string compares can be done.
m_val = null;
m_expression = null;
m_isVisible = true;
m_isFromWithParam = false;
}
/**
* Construct a parameter argument that contains an expression.
*
* @param qname Name of the argument, expressed as a QName object.
* @param expression String to be stored as this argument's value expression.
* @param isFromWithParam True if this is a parameter variable.
*/
public Arg(QName qname, String expression, boolean isFromWithParam)
{
m_qname = qname;
m_val = null;
m_expression = expression;
m_isFromWithParam = isFromWithParam;
m_isVisible = !isFromWithParam;
}
/**
* Construct a parameter argument which has an XObject value.
* isVisible defaults to true.
*
* @param qname Name of the argument, expressed as a QName object.
* @param val Value of the argument, expressed as an XObject
*/
public Arg(QName qname, XObject val)
{
m_qname = qname;
m_val = val;
m_isVisible = true;
m_isFromWithParam = false;
m_expression = null;
}
/**
* Equality function specialized for the variable name. If the argument
* is not a qname, it will deligate to the super class.
*
* @param obj the reference object with which to compare.
* @return <code>true</code> if this object is the same as the obj
* argument; <code>false</code> otherwise.
*/
public boolean equals(Object obj)
{
if(obj instanceof QName)
{
return m_qname.equals(obj);
}
else
return super.equals(obj);
}
/**
* Construct a parameter argument.
*
* @param qname Name of the argument, expressed as a QName object.
* @param val Value of the argument, expressed as an XObject
* @param isFromWithParam True if this is a parameter variable.
*/
public Arg(QName qname, XObject val, boolean isFromWithParam)
{
m_qname = qname;
m_val = val;
m_isFromWithParam = isFromWithParam;
m_isVisible = !isFromWithParam;
m_expression = null;
}
}