base.jee.servlet.ApiServlet Maven / Gradle / Ivy
/**
* Creative commons Attribution-NonCommercial license.
*
* http://creativecommons.org/licenses/by-nc/2.5/au/deed.en_GB
*
* NO WARRANTY IS GIVEN OR IMPLIED, USE AT YOUR OWN RISK.
*/
package base.jee.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import base.Command;
import base.KeyValue;
import base.Query;
import base.QueryResult;
import base.jee.Constants;
import base.jee.api.Settings;
import base.jee.AuthorisationFilter;
import base.jee.JeeBase;
import base.security.User;
import base.text.StringHelper;
public class ApiServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected Settings settings;
protected JeeBase jee;
public ApiServlet(JeeBase jee) throws IOException {
this.settings = jee.getSettings();
this.jee = jee;
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String command = request.getPathInfo();
if(command.startsWith("/")) {
command = command.substring(1);
}
response.setContentType("text/plain; charset=utf8");
String token = (String)request.getAttribute(jee.cookieName);
if(token == null) {
for (Cookie cookie : request.getCookies()) {
if (cookie.getName().equalsIgnoreCase(jee.cookieName)) {
token = cookie.getValue();
break;
}
}
}
User u = jee.getAPI().getSession(token, BaseServlet.getIp(request)).get(0);
for(Query i : jee.getApiQueries()) {
if(i.getClass().getSimpleName().equalsIgnoreCase(command)) {
List results = null;
try {
Map parameters = requestToParameters(request, u);
if(command.equals("InvalidateToken")) {
AuthorisationFilter.attachCookieToResponse(jee, response, StringHelper.randomString(Constants.SESSION_TOKEN_LENGTH));
parameters.put("token", token);
}
if(command.equals("GetSession")) {
parameters.put("token", token);
parameters.put("ip", u.getIp());
}
results = i.newWithParameters(parameters).run();
} catch(IllegalArgumentException e) {
PrintWriter out = response.getWriter();
out.println("{\"error\":\"" + e.getMessage() + "\"}");
return;
} catch(Exception e) {
PrintWriter out = response.getWriter();
out.println("{\"error\":\"" + e.toString() + "\"}");
return;
}
if(command.equals("Authenticate") && results.size() > 0 && ((KeyValue)results.get(0)).getKey().equals("token")) {
AuthorisationFilter.attachCookieToResponse(jee, response, ((KeyValue)results.get(0)).getValue());
}
PrintWriter out = response.getWriter();
out.print("[");
boolean first = true;
for(QueryResult r : results) {
if(first) {
first = !first;
out.print("\n\t" + r.toJson());
} else {
out.print(",\n\t" + r.toJson());
}
}
out.print("\n]");
return;
}
}
PrintWriter out = response.getWriter();
for(Command i : jee.getApiCommands()) {
if(i.getClass().getSimpleName().equalsIgnoreCase(command)) {
try {
Map parameters = requestToParameters(request, u);
i.newWithParameters(parameters).run();
} catch(IllegalArgumentException e) {
out.println("{\"error\":\"" + e.getMessage() + "\"}");
return;
} catch(Exception e) {
out.println("{\"error\":\"" + e.toString() + "\"}");
return;
}
out.println("{\"success\":\"ok\"}");
return;
}
}
out.println("{\"error\":\"Unknown command\"}");
}
private Map requestToParameters(HttpServletRequest request, User u) {
Map parameters = new Hashtable<>();
parameters.put("jee", jee);
parameters.put("user", u);
parameters.put("api", jee.getAPI());
for(Entry p : request.getParameterMap().entrySet()) {
if(p.getValue().length == 1) {
parameters.put(p.getKey(), p.getValue()[0]);
} else if(p.getValue().length > 1) {
parameters.put(p.getKey(), p.getValue());
}
}
return parameters;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy