package org.basex.query.up; import static org.basex.query.util.Err.*; import java.util.HashSet; import java.util.Set; import org.basex.data.Data; import org.basex.query.QueryContext; import org.basex.query.QueryException; import org.basex.query.up.primitives.UpdatePrimitive; /** * The Transform context modifier carries out updates of a single transform * expression. It especially keeps track of all nodes that are copied in the * 'copy' statement of a transform expression. * * @author BaseX Team 2005-12, BSD License * @author Lukas Kircher */ public final class TransformModifier extends ContextModifier { /** Holds all data references created by the copy clause of a transform * expression. Adding an update primitive that is declared within the modify * clause of this transform expression will cause a query exception * (XUDY0014) if the data reference of the corresponding target node is not * part of this set, hence the target node has not been copied. */ private final Set<Data> refs = new HashSet<Data>(); /** * Adds a data reference to list which keeps track of the nodes copied * within a transform expression. * @param d reference */ public void addData(final Data d) { refs.add(d); } @Override void add(final UpdatePrimitive p, final QueryContext ctx) throws QueryException { add(p); /* check if the target node of the given primitive has been copied in the * 'copy' statement of this transform expression. */ if(!refs.contains(p.data)) UPNOTCOPIED.thrw(p.input, p.targetNode()); } }