All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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