package org.basex.query.item; import static org.basex.query.util.Err.*; import static org.basex.query.QueryText.*; import java.io.IOException; import org.basex.io.serial.Serializer; import org.basex.query.QueryException; import org.basex.util.InputInfo; import org.basex.util.Util; import static org.basex.util.Token.*; import org.w3c.dom.ProcessingInstruction; /** * PI node fragment. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public final class FPI extends FNode { /** Closing processing instruction. */ private static final byte[] CLOSE = { '?', '>' }; /** PI name. */ private final QNm name; /** * Constructor. * @param n name * @param v value */ public FPI(final QNm n, final byte[] v) { super(NodeType.PI); name = n; val = v; } /** * Constructor for DOM nodes. * Originally provided by Erdal Karaca. * @param pi DOM node */ public FPI(final ProcessingInstruction pi) { this(new QNm(token(pi.getTarget())), token(pi.getData())); } @Override public QNm qname() { return name; } @Override public byte[] name() { return name.string(); } @Override public void serialize(final Serializer ser) throws IOException { ser.pi(name.string(), val); } @Override public FNode copy() { return new FPI(name, val).parent(par); } @Override public void plan(final Serializer ser) throws IOException { ser.emptyElement(this, NAM, name.string(), VAL, val); } @Override public String toString() { return Util.info("<?% %?>", name.string(), val); } /** * Checks the specified token for validity. * @param atom token to be checked * @param ii input info * @return token * @throws QueryException query exception */ public static byte[] parse(final byte[] atom, final InputInfo ii) throws QueryException { if(contains(atom, CLOSE)) CPICONT.thrw(ii, atom); return atom; } }