package org.basex.api.xqj;
import static org.basex.api.xqj.BXQText.VAR;
import java.util.Arrays;
import javax.xml.namespace.QName;
import javax.xml.xquery.XQException;
import javax.xml.xquery.XQItemType;
import javax.xml.xquery.XQPreparedExpression;
import javax.xml.xquery.XQQueryException;
import javax.xml.xquery.XQResultSequence;
import javax.xml.xquery.XQSequenceType;
import javax.xml.xquery.XQStaticContext;
import org.basex.query.QueryException;
import org.basex.query.item.QNm;
import org.basex.query.util.Var;
import org.basex.query.util.VarStack;
import org.basex.util.Array;
import org.basex.util.Token;
import org.xml.sax.XMLReader;
/**
* Java XQuery API - Prepared Expression.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
final class BXQPreparedExpression extends BXQDynamicContext
implements XQPreparedExpression {
/**
* Constructor.
* @param input query instance
* @param s static context
* @param c closer
* @throws XQQueryException exception
*/
BXQPreparedExpression(final String input, final BXQStaticContext s,
final BXQConnection c) throws XQQueryException {
super(input, s, c);
try {
qp.parse();
} catch(final QueryException ex) {
final QNm qnm = ex.qname();
throw new XQQueryException(ex.getMessage(),
new QName(Token.string(qnm.uri()), Token.string(qnm.local())),
ex.line(), ex.col(), -1);
}
}
@Override
public void cancel() throws XQException {
opened();
qp.ctx.stop();
}
@Override
public XQResultSequence executeQuery() throws XQException {
//qp.reset();
return execute();
}
@Override
public QName[] getAllExternalVariables() throws XQException {
return getVariables(true);
}
@Override
public QName[] getAllUnboundExternalVariables() throws XQException {
return getVariables(false);
}
/**
* Returns the names of all global variables.
* @param all return all/unbound variables
* @throws XQException query exception
* @return variables
*/
private QName[] getVariables(final boolean all) throws XQException {
opened();
QName[] names = { };
final VarStack vars = qp.ctx.vars.globals();
for(final Var v : Arrays.copyOf(vars.vars, vars.size)) {
if(all || v.expr() == null) names = Array.add(names, v.name.toJava());
}
return names;
}
@Override
public XQStaticContext getStaticContext() throws XQException {
opened();
return sc;
}
@Override
public XQSequenceType getStaticResultType() throws XQException {
opened();
return BXQItemType.DEFAULT;
}
@Override
public XQSequenceType getStaticVariableType(final QName qn)
throws XQException {
opened();
valid(qn, String.class);
final QNm nm = new QNm(qn);
final Var var = qp.ctx.vars.get(nm);
if(var == null) throw new BXQException(VAR, nm);
return var.type != null ? new BXQItemType(var.type.type) :
BXQItemType.DEFAULT;
}
@Override
public void bindDocument(QName arg0, XMLReader arg1, XQItemType arg2) throws XQException
{
// TODO Auto-generated method stub
}
}