package org.basex.io.serial;
import static org.basex.util.Token.*;
import java.io.IOException;
import org.basex.build.Builder;
import org.basex.query.item.Item;
import org.basex.util.Atts;
import org.basex.util.Util;
/**
* A serializer that pipes the events directly through to a builder.
*
* @author BaseX Team 2005-12, BSD License
* @author Leo Woerteler
*/
public class BuilderSerializer extends Serializer {
/** Attribute cache. */
private final Atts att = new Atts();
/** The builder. */
private final Builder build;
/**
* Constructor taking a Builder.
* @param b builder to be used
*/
public BuilderSerializer(final Builder b) {
build = b;
}
@Override
public final void finishText(final byte[] b) throws IOException {
build.text(b);
}
@Override
protected void startOpen(final byte[] t) throws IOException {
}
@Override
public final void finishPi(final byte[] n, final byte[] v)
throws IOException {
build.pi(concat(n, SPACE, v));
}
@Override
public final void finishItem(final Item b) throws IOException {
Util.notexpected();
}
@Override
protected final void finishOpen() throws IOException {
build.startElem(tag, att);
att.reset();
}
@Override
protected void finishEmpty() throws IOException {
build.emptyElem(tag, att);
att.reset();
}
@Override
protected void finishClose() throws IOException {
build.endElem();
}
@Override
public final void finishComment(final byte[] b) throws IOException {
build.comment(b);
}
@Override
public final void attribute(final byte[] n, final byte[] v)
throws IOException {
if(startsWith(n, XMLNS)) {
if(n.length == 5) {
build.startNS(EMPTY, v);
} else if(n[5] == ':') {
build.startNS(substring(n, 6), v);
} else att.add(n, v);
} else {
att.add(n, v);
}
}
@Override
protected void openDoc(final byte[] name) throws IOException {
build.startDoc(name);
}
@Override
protected final void closeDoc() throws IOException {
build.endDoc();
}
}