package org.basex.http.rest;
import static org.basex.http.rest.RESTText.*;
import java.io.*;
import java.util.*;
import java.util.Map.Entry;
import org.basex.http.*;
import org.basex.io.serial.*;
import org.basex.util.*;
/**
* This class processes GET requests sent to the REST server.
*
* @author BaseX Team 2005-17, BSD License
* @author Christian Gruen
*/
final class RESTGet {
/** Private constructor. */
private RESTGet() { }
/**
* Creates and returns a REST command.
* @param session REST session
* @return code
* @throws IOException I/O exception
*/
public static RESTCmd get(final RESTSession session) throws IOException {
final Map<String, String[]> vars = new HashMap<>();
// parse query string
String op = null, input = null, value = null;
final HTTPConnection conn = session.conn;
final SerializerOptions sopts = conn.sopts();
for(final Entry<String, String[]> param : conn.params.map().entrySet()) {
final String key = param.getKey();
final String[] vals = param.getValue();
final String val = vals[0];
if(Strings.eqic(key, COMMAND, QUERY, RUN)) {
if(op != null || vals.length > 1) throw HTTPCode.ONEOP.get();
op = key;
input = val;
} else if(key.equalsIgnoreCase(CONTEXT)) {
// context parameter
value = val;
} else if(sopts.option(key) != null) {
// serialization parameters
for(final String v : vals) sopts.assign(key, v);
} else if(!RESTCmd.parseOption(session, param, false)) {
// options or (if not found) external variables
vars.put(key, new String[] { val });
}
}
if(op == null) return RESTRetrieve.get(session);
if(op.equals(QUERY)) return RESTQuery.get(session, input, vars, value);
if(op.equals(RUN)) return RESTRun.get(session, input, vars, value);
return RESTCommand.get(session, input);
}
}