package org.basex.query.up.expr;
import static org.basex.query.util.Err.*;
import static org.basex.util.Token.*;
import org.basex.query.QueryContext;
import org.basex.query.QueryException;
import org.basex.query.expr.Arr;
import org.basex.query.expr.Expr;
import org.basex.query.item.ANode;
import org.basex.query.item.QNm;
import org.basex.query.iter.NodeCache;
import org.basex.util.InputInfo;
/**
* Abstract update expression.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
abstract class Update extends Arr {
/**
* Constructor.
* @param ii input info
* @param e expressions
*/
Update(final InputInfo ii, final Expr... e) {
super(ii, e);
}
@Override
public boolean uses(final Use u) {
return u == Use.UPD || super.uses(u);
}
/**
* Checks if the new namespaces have conflicting namespaces.
* @param list node list
* @param targ target node
* @param ctx query context
* @throws QueryException query exception
* @return specified node list
*/
final NodeCache checkNS(final NodeCache list, final ANode targ,
final QueryContext ctx) throws QueryException {
for(int a = 0; a < list.size(); ++a) {
final QNm name = list.get(a).qname();
final byte[] pref = name.prefix();
// attributes without prefix have no namespace
if(pref.length == 0) continue;
// check if attribute and target have the same namespace
final byte[] uri = targ.uri(pref, ctx);
if(uri != null && !eq(name.uri(), uri)) UPNSCONFL.thrw(input);
}
return list;
}
}