FileDocCategorySizeDatePackage
Variable.javaAPI DocJava SE 6 API12229Tue Jun 10 00:23:16 BST 2008com.sun.org.apache.xpath.internal.operations

Variable

public class Variable extends Expression implements PathComponent
The variable reference expression executer.

Fields Summary
static final long
serialVersionUID
private boolean
m_fixUpWasCalled
Tell if fixupVariables was called.
protected QName
m_qname
The qualified name of the variable.
protected int
m_index
The index of the variable, which is either an absolute index to a global, or, if higher than the globals area, must be adjusted by adding the offset to the current stack frame.
protected boolean
m_isGlobal
static final String
PSUEDOVARNAMESPACE
Constructors Summary
Methods Summary
public voidcallVisitors(com.sun.org.apache.xpath.internal.ExpressionOwner owner, com.sun.org.apache.xpath.internal.XPathVisitor visitor)

see
com.sun.org.apache.xpath.internal.XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)

  	visitor.visitVariableRef(owner, this);
  
public booleandeepEquals(com.sun.org.apache.xpath.internal.Expression expr)

see
Expression#deepEquals(Expression)

  	if(!isSameClass(expr))
  		return false;
  		
  	if(!m_qname.equals(((Variable)expr).m_qname))
  		return false;
  		
    // J2SE does not support Xalan interpretive
    /*
  	// We have to make sure that the qname really references 
  	// the same variable element.
    if(getElemVariable() != ((Variable)expr).getElemVariable())
    	return false;
  	*/
    
  	return true;
  
public com.sun.org.apache.xpath.internal.objects.XObjectexecute(com.sun.org.apache.xpath.internal.XPathContext xctxt)
Execute an expression in the XPath runtime context, and return the result of the expression.

param
xctxt The XPath runtime context.
return
The result of the expression in the form of a XObject.
throws
javax.xml.transform.TransformerException if a runtime exception occurs.

  	return execute(xctxt, false);
  
public com.sun.org.apache.xpath.internal.objects.XObjectexecute(com.sun.org.apache.xpath.internal.XPathContext xctxt, boolean destructiveOK)
Dereference the variable, and return the reference value. Note that lazy evaluation will occur. If a variable within scope is not found, a warning will be sent to the error listener, and an empty nodeset will be returned.

param
xctxt The runtime execution context.
return
The evaluated variable, or an empty nodeset if not found.
throws
javax.xml.transform.TransformerException

    com.sun.org.apache.xml.internal.utils.PrefixResolver xprefixResolver = xctxt.getNamespaceContext();

    XObject result;
    // Is the variable fetched always the same?
    // XObject result = xctxt.getVariable(m_qname);
    if(m_fixUpWasCalled)
    {    
      if(m_isGlobal)
        result = xctxt.getVarStack().getGlobalVariable(xctxt, m_index, destructiveOK);
      else
        result = xctxt.getVarStack().getLocalVariable(xctxt, m_index, destructiveOK);
    } 
    else {  
    	result = xctxt.getVarStack().getVariableOrParam(xctxt,m_qname);
    }
  
      if (null == result)
      {
        // This should now never happen...
        warn(xctxt, XPATHErrorResources.WG_ILLEGAL_VARIABLE_REFERENCE,
             new Object[]{ m_qname.getLocalPart() });  //"VariableReference given for variable out "+
  //      (new RuntimeException()).printStackTrace();
  //      error(xctxt, XPATHErrorResources.ER_COULDNOT_GET_VAR_NAMED,
  //            new Object[]{ m_qname.getLocalPart() });  //"Could not get variable named "+varName);
        
        result = new XNodeSet(xctxt.getDTMManager());
      }
  
      return result;
//    }
//    else
//    {
//      // Hack city... big time.  This is needed to evaluate xpaths from extensions, 
//      // pending some bright light going off in my head.  Some sort of callback?
//      synchronized(this)
//      {
//      	com.sun.org.apache.xalan.internal.templates.ElemVariable vvar= getElemVariable();
//      	if(null != vvar)
//      	{
//          m_index = vvar.getIndex();
//          m_isGlobal = vvar.getIsTopLevel();
//          m_fixUpWasCalled = true;
//          return execute(xctxt);
//      	}
//      }
//      throw new javax.xml.transform.TransformerException(XSLMessages.createXPATHMessage(XPATHErrorResources.ER_VAR_NOT_RESOLVABLE, new Object[]{m_qname.toString()})); //"Variable not resolvable: "+m_qname);
//    }
  
public voidfixupVariables(java.util.Vector vars, int globalsSize)
This function is used to fixup variables from QNames to stack frame indexes at stylesheet build time.

param
vars List of QNames that correspond to variables. This list should be searched backwards for the first qualified name that corresponds to the variable reference qname. The position of the QName in the vector from the start of the vector will be its position in the stack frame (but variables above the globalsTop value will need to be offset to the current stack frame).

  
                                                                                               
       
  
    m_fixUpWasCalled = true;
    int sz = vars.size();

    for (int i = vars.size()-1; i >= 0; i--) 
    {
      QName qn = (QName)vars.elementAt(i);
      // System.out.println("qn: "+qn);
      if(qn.equals(m_qname))
      {
        
        if(i < globalsSize)
        {
          m_isGlobal = true;
          m_index = i;
        }
        else
        {
          m_index = i-globalsSize;
        }
          
        return;
      }
    }
    
    java.lang.String msg = XSLMessages.createXPATHMessage(XPATHErrorResources.ER_COULD_NOT_FIND_VAR, 
                                             new Object[]{m_qname.toString()});
                                             
    TransformerException te = new TransformerException(msg, this);
                                             
    throw new com.sun.org.apache.xml.internal.utils.WrappedRuntimeException(te);
    
  
public intgetAnalysisBits()
Get the analysis bits for this walker, as defined in the WalkerFactory.

return
One of WalkerFactory#BIT_DESCENDANT, etc.

    
    // J2SE does not support Xalan interpretive
    /*
  	com.sun.org.apache.xalan.internal.templates.ElemVariable vvar = getElemVariable();
  	if(null != vvar)
  	{
  		XPath xpath = vvar.getSelect();
  		if(null != xpath)
  		{
	  		Expression expr = xpath.getExpression();
	  		if(null != expr && expr instanceof PathComponent)
	  		{
	  			return ((PathComponent)expr).getAnalysisBits();
	  		}
  		}
  	}
    */
    
    return WalkerFactory.BIT_FILTER;
  
public booleangetGlobal()
Set the index for the variable into the stack. For advanced use only.

return
true if this should be a global variable reference.

  	return m_isGlobal;
  
public intgetIndex()
Set the index for the variable into the stack. For advanced use only.

return
index a global or local index.

  	return m_index;
  
public com.sun.org.apache.xml.internal.utils.QNamegetQName()
Get the qualified name of the variable.

return
A non-null reference to a qualified name.

    return m_qname;
  
public booleanisPsuedoVarRef()
Tell if this is a psuedo variable reference, declared by Xalan instead of by the user.

  
                      
    
  
  	java.lang.String ns = m_qname.getNamespaceURI();
  	if((null != ns) && ns.equals(PSUEDOVARNAMESPACE))
  	{
  		if(m_qname.getLocalName().startsWith("#"))
  			return true;
  	}
  	return false;
  
public booleanisStableNumber()
Tell if this expression returns a stable number that will not change during iterations within the expression. This is used to determine if a proximity position predicate can indicate that no more searching has to occur.

return
true if the expression represents a stable number.

    return true;
  
public voidsetIndex(int index)
Set the index for the variable into the stack. For advanced use only. You must know what you are doing to use this.

param
index a global or local index.

  
                                      
     
  
  	m_index = index;
  
public voidsetIsGlobal(boolean isGlobal)
Set whether or not this is a global reference. For advanced use only.

param
isGlobal true if this should be a global variable reference.

  	m_isGlobal = isGlobal;
  
public voidsetQName(com.sun.org.apache.xml.internal.utils.QName qname)
Set the qualified name of the variable.

param
qname Must be a non-null reference to a qualified name.

    m_qname = qname;