package org.basex.data; import static org.basex.core.Text.*; import static org.basex.data.DataText.*; import org.basex.util.*; import org.basex.util.list.*; /** * Serializes the database table to a string representation. * * @author BaseX Team 2005-17, BSD License * @author Christian Gruen */ public final class DataPrinter { /** Data reference. */ private final Data data; /** Table reference. */ private final Table table; /** Namespaces. */ private final TokenBuilder nsp = new TokenBuilder(); /** * Constructor. * @param data data reference */ public DataPrinter(final Data data) { this.data = data; table = new Table(); table.header.add(TABLEPRE); table.header.add(TABLEDIST); table.header.add(TABLESIZE); table.header.add(TABLEATS); table.header.add(TABLEID); table.header.add(TABLENS); table.header.add(TABLEKND); table.header.add(TABLECON); for(int i = 0; i < 6; ++i) table.align.add(true); } /** * Adds the specified table entries. * @param start first node to be added * @param end last node to be added */ public void add(final int start, final int end) { final int ps = Math.max(0, start), pe = Math.min(data.meta.size, end); for(int p = ps; p < pe; ++p) add(p); final byte[] ns = data.nspaces.table(ps, pe); if(ns.length != 0) nsp.add(NL).add(ns).add(data.nspaces.toString(ps, pe)).add(NL); } /** * Adds an entry for the specified pre value. * @param pre node to be added */ private void add(final int pre) { final int k = data.kind(pre); final TokenList tl = new TokenList(); tl.add(pre); tl.add(pre - data.parent(pre, k)); tl.add(data.size(pre, k)); tl.add(data.attSize(pre, k)); tl.add(data.id(pre)); final int uriId = data.uriId(pre, k); if(data.nsFlag(pre)) tl.add("+" + uriId); else tl.add(uriId); tl.add(TABLEKINDS[k]); final byte[] cont; if(k == Data.ELEM) { cont = data.name(pre, Data.ELEM); } else if(k == Data.ATTR) { cont = new TokenBuilder(data.name(pre, Data.ATTR)).add(ATT1).add(data.text(pre, false)). add(ATT2).finish(); } else { cont = data.text(pre, true); } tl.add(Token.replace(Token.chop(cont, 64), '\n', ' ')); table.contents.add(tl); } /** * Returns the token representation. * @return table */ public byte[] finish() { return Token.concat(table.finish(), nsp.finish()); } @Override public String toString() { return Token.string(finish()); } }