package net.fortytwo.sesametools.ldserver.query;
import net.fortytwo.sesametools.ldserver.LinkedDataServer;
import org.openrdf.sail.Sail;
import org.restlet.Request;
import org.restlet.Restlet;
import org.restlet.resource.ResourceException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
/**
* @author Joshua Shinavier (http://fortytwo.net)
*/
public abstract class QueryResource extends Restlet {
private static final Logger logger = Logger.getLogger(QueryResource.class.getName());
private static final String UTF_8 = "UTF-8";
private static final int
MAX_LIMIT = 500,
DEFAULT_LIMIT = 300;
private static final String LIMIT_PARAM = "limit";
protected String selfURI;
protected Sail sail;
//private final String query;
protected Map<String, String> getArguments(final Request request) throws ResourceException {
Map<String, String> arguments;
selfURI = request.getResourceRef().toString();
sail = LinkedDataServer.getInstance().getSail();
//getVariants().add(new Variant(MediaType.APPLICATION_JSON));
int i = selfURI.lastIndexOf("?");
arguments = new HashMap<>();
if (0 < i) {
String args = selfURI.substring(i + 1);
if (0 < args.length()) {
try {
arguments = parseParams(args);
} catch (UnsupportedEncodingException e) {
throw new ResourceException(e);
}
}
}
return arguments;
}
protected Map<String, String> parseParams(final String s) throws UnsupportedEncodingException {
Map<String, String> map = new HashMap<>();
String[] a = s.split("&");
for (String p : a) {
String[] b = p.split("=");
map.put(urlDecode(b[0]), urlDecode(b[1]));
}
return map;
}
protected int readLimit(final Map<String, String> arguments) {
String l = arguments.get(LIMIT_PARAM);
int limit;
if (null == l) {
limit = DEFAULT_LIMIT;
} else {
try {
limit = Integer.valueOf(l);
if (limit > MAX_LIMIT) {
limit = MAX_LIMIT;
} else if (limit < 1) {
limit = DEFAULT_LIMIT;
}
} catch (NumberFormatException e) {
logger.warning("bad limit value: " + l);
limit = DEFAULT_LIMIT;
}
}
return limit;
}
protected String urlDecode(final String encoded) throws UnsupportedEncodingException {
return URLDecoder.decode(encoded, UTF_8);
}
}