package org.basex.query.func;
import static org.basex.query.util.Err.*;
import static org.basex.util.Token.*;
import java.io.IOException;
import org.basex.io.out.ArrayOutput;
import org.basex.io.serial.JSONSerializer;
import org.basex.io.serial.JsonMLSerializer;
import org.basex.io.serial.Serializer;
import org.basex.io.serial.SerializerException;
import org.basex.io.serial.SerializerProp;
import org.basex.query.QueryContext;
import org.basex.query.QueryException;
import org.basex.query.expr.Expr;
import org.basex.query.item.ANode;
import org.basex.query.item.Item;
import org.basex.query.item.Str;
import org.basex.query.util.json.JSONConverter;
import org.basex.query.util.json.JsonMLConverter;
import org.basex.util.InputInfo;
/**
* Project specific functions.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class FNJson extends StandardFunc {
/**
* Constructor.
* @param ii input info
* @param f function definition
* @param e arguments
*/
public FNJson(final InputInfo ii, final Function f, final Expr... e) {
super(ii, f, e);
}
@Override
public Item item(final QueryContext ctx, final InputInfo ii)
throws QueryException {
switch(sig) {
case _JSON_PARSE:
return new JSONConverter(input).parse(checkStr(expr[0], ctx));
case _JSON_PARSE_ML:
return new JsonMLConverter(input).parse(checkStr(expr[0], ctx));
case _JSON_SERIALIZE:
return serialize(false, ctx);
case _JSON_SERIALIZE_ML:
return serialize(true, ctx);
default:
return super.item(ctx, ii);
}
}
/**
* Serializes the specified XML document to JSON/JsonML.
* @param ml ml flag
* @param ctx query context
* @return serialized document
* @throws QueryException query exception
*/
private Str serialize(final boolean ml, final QueryContext ctx)
throws QueryException {
final ANode node = checkNode(checkItem(expr[0], ctx));
final ArrayOutput ao = new ArrayOutput();
try {
// run serialization
final SerializerProp props = ctx.serProp(false);
final Serializer json = ml ? new JsonMLSerializer(ao, props) :
new JSONSerializer(ao, props);
node.serialize(json);
json.close();
} catch(final SerializerException ex) {
throw ex.getCause(input);
} catch(final IOException ex) {
SERANY.thrw(input, ex);
}
return Str.get(delete(ao.toArray(), '\r'));
}
}