package org.basex.http.rest;
import static org.basex.query.func.Function.*;
import static org.basex.util.Token.*;
import java.io.*;
import org.basex.core.*;
import org.basex.core.cmd.*;
import org.basex.http.*;
import org.basex.io.serial.*;
import org.basex.query.func.*;
import org.basex.query.value.node.*;
import org.basex.util.*;
/**
* Retrieve resources via REST.
*
* @author BaseX Team 2005-17, BSD License
* @author Christian Gruen
*/
final class RESTRetrieve extends RESTCmd {
/**
* Constructor.
* @param session REST session
*/
private RESTRetrieve(final RESTSession session) {
super(session);
}
@Override
protected void run0() throws IOException {
// open addressed database
for(final Command cmd : session) run(cmd);
final HTTPConnection conn = session.conn;
final SerializerOptions sopts = conn.sopts();
if(run(query(_DB_EXISTS)).equals(Text.TRUE)) {
// return database resource
final boolean raw = run(query(_DB_IS_RAW)).equals(Text.TRUE);
if(raw) sopts.set(SerializerOptions.MEDIA_TYPE, run(query(_DB_CONTENT_TYPE)));
conn.initResponse();
context.options.set(MainOptions.SERIALIZER, sopts);
run(query(raw ? _DB_RETRIEVE : _DB_OPEN), conn.res.getOutputStream());
} else {
// list database resources
final Table table = new Table(run(new List(conn.db(), conn.dbpath())));
final FElem el = new FElem(RESTText.Q_DATABASE).declareNS();
el.add(RESTText.NAME, conn.db()).add(RESTText.RESOURCES, token(table.contents.size()));
list(table, el, RESTText.Q_RESOURCE, 0);
conn.initResponse();
try(Serializer ser = Serializer.get(conn.res.getOutputStream(), sopts)) {
ser.serialize(el);
}
}
}
/**
* Creates a query instance.
* @param f function
* @return query
*/
private XQuery query(final Function f) {
final HTTPConnection conn = session.conn;
final String query = "declare variable $d external;" +
"declare variable $p external;" + f.args("$d", "$p");
return new XQuery(query).bind("d", conn.db()).bind("p", conn.dbpath());
}
/**
* Creates a new instance of this command.
* @param session REST session
* @return command
*/
static RESTCmd get(final RESTSession session) {
final String db = session.conn.db();
return db.isEmpty() ? new RESTList(session.add(new List())) : new RESTRetrieve(session);
}
}