blob: faa363e6941dccf94307bd77bbf2c6be74a0ad2c [file] [log] [blame]
package org.apache.xpath.seqctor;
import javax.xml.transform.TransformerException;
import org.apache.xml.utils.QName;
import org.apache.xpath.Expression;
import org.apache.xpath.ExpressionOwner;
import org.apache.xpath.VariableComposeState;
import org.apache.xpath.XPathContext;
import org.apache.xpath.XPathVisitor;
import org.apache.xpath.objects.XObject;
import org.apache.xpath.operations.Variable;
import org.apache.xpath.parser.Node;
public class FLWRExpr extends Expression implements ExpressionOwner
{
Binding[] m_bindings;
Expression m_return;
/**
* Constructor for FLWRExpr
*/
public FLWRExpr()
{
super();
}
/**
* @see SimpleNode#shouldReduceIfOneChild()
*/
public boolean shouldReduceIfOneChild()
{
return (jjtGetNumChildren() == 1) ? true : false;
}
/**
* @see org.apache.xpath.XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
*/
public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
{
}
/**
* @see org.apache.xpath.Expression#deepEquals(Expression)
*/
public boolean deepEquals(Expression expr)
{
return false;
}
/**
* @see org.apache.xpath.Expression#execute(XPathContext)
*/
public XObject execute(XPathContext xctxt) throws TransformerException
{
return new FLWRIter(m_bindings, m_return, xctxt);
}
/**
* @see org.apache.xpath.Expression#fixupVariables(Vector, int)
*/
public void fixupVariables(VariableComposeState vcs)
{
vcs.pushStackMark();
Binding[] bindings = m_bindings;
int globalsSize = vcs.getGlobalsSize();
for (int i = 0; i < bindings.length; i++)
{
Binding binding = bindings[i];
binding.getExpr().fixupVariables(vcs);
Variable var = binding.getVar();
QName varName = var.getQName();
int index = vcs.addVariableName(varName) - globalsSize;
var.setIndex(index);
var.setFixUpWasCalled(true);
// var.fixupVariables(vcs);
}
m_return.fixupVariables(vcs);
vcs.popStackMark();
}
/**
* @see org.apache.xpath.ExpressionOwner#getExpression()
*/
public Expression getExpression()
{
return null;
}
/**
* @see org.apache.xpath.ExpressionOwner#setExpression(Expression)
*/
public void setExpression(Expression exp)
{
m_return = exp;
}
/**
* Returns the r.
* @return Expression
*/
public Expression getReturn()
{
return m_return;
}
/**
* Sets the inExprs.
* @param inExprs The inExprs to set
*/
public void setBindings(Binding[] bindings)
{
m_bindings = bindings;
}
/**
* Sets the r.
* @param r The r to set
*/
public void setReturn(Expression r)
{
m_return = r;
}
/**
* @see org.apache.xpath.parser.Node#jjtAddChild(Node, int)
*/
public void jjtAddChild(Node n, int i)
{
if(null == m_bindings && 0 == i)
m_return = (Expression)fixupPrimarys(n); // Act like a construction node!
else if(i == 2)
m_return = (Expression)fixupPrimarys(n);
}
/**
* @see org.apache.xpath.parser.Node#jjtGetChild(int)
*/
public Node jjtGetChild(int i)
{
if (i == jjtGetNumChildren() - 1)
return m_return;
else
if (null != m_bindings)
{
if ((i % 2) == 1)
return m_bindings[i / 2].getVar();
else
return m_bindings[i / 2].getExpr();
}
else
return null;
}
/**
* @see org.apache.xpath.parser.Node#jjtGetNumChildren()
*/
public int jjtGetNumChildren()
{
return (((null != m_bindings) ? m_bindings.length : 0)*2)+
((null != m_return) ? 1 : 0);
}
}