package ru.semiot.services.analyzing.rest; import javax.ejb.Stateless; import javax.inject.Inject; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.semiot.services.analyzing.cep.Engine; import ru.semiot.services.analyzing.database.EventsDataBase; import ru.semiot.services.analyzing.database.QueryDataBase; /** * * @author Daniil Garayzuev <garayzuev@gmail.com> */ @Stateless @Path("query") public class Queries { private static final Logger logger = LoggerFactory .getLogger(Queries.class); @Inject private QueryDataBase db; @Inject Engine engine; @Inject EventsDataBase dbe; @GET @Produces(MediaType.APPLICATION_JSON) public Response getQueries() { logger.debug("Return queries"); JSONArray ret = db.getQueries(); if (ret == null) { return Response.status(Response.Status.NOT_FOUND).build(); } return Response.ok().entity(ret.toString()).build(); } @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response create(String request) { logger.debug("Appending query"); if (request == null || request.isEmpty()) { return Response.status(Response.Status.BAD_REQUEST).build(); } try { JSONObject object = new JSONObject(request); if (!object.has("name") || !object.has("sparql") || !object.has("text")) { return Response.status(Response.Status.BAD_REQUEST).build(); } JSONObject ret = db.appendQuery(object.getString("text"), object.getString("name"), object.getString("sparql")); int query_id = ret.getInt("id"); if (!engine.registerQuery(query_id)) { db.removeQuery(query_id); return Response.status(Response.Status.BAD_REQUEST).build(); } logger.info("Query " + ret.getString("name") + " appended"); return Response.ok(ret.toString()).build(); } catch (JSONException e) { return Response.status(Response.Status.BAD_REQUEST).build(); } } @GET @Path("count") @Produces(MediaType.TEXT_PLAIN) public String count() { return Long.toString(db.getCount()); } @GET @Path("{id}") @Produces(MediaType.APPLICATION_JSON) public Response getQuery(@PathParam("id") Integer id) { logger.debug("Return query"); JSONObject ret = db.getQuery(id); if (ret == null) { return Response.status(Response.Status.NOT_FOUND).build(); } /*JSONArray events = dbe.getEventsByQueryId(id); if (events != null) { ret.append("events", events); }*/ return Response.ok(ret.toString()).build(); } @GET @Path("{id}/events") @Produces(MediaType.APPLICATION_JSON) public Response getEventsByTime(@PathParam("id") Integer id, @DefaultValue("-1") @QueryParam("from") long start_timestamp, @DefaultValue("-1") @QueryParam("to") long end_timestamp) { logger.debug("Return events"); JSONArray events; if(start_timestamp!=-1 && end_timestamp!=-1) events = dbe.getEventsByTime(start_timestamp, end_timestamp, id); else events = dbe.getEventsByQueryId(id); if (events == null) { return Response.status(Response.Status.NOT_FOUND).build(); } return Response.ok(events.toString()).build(); } @DELETE @Path("{id}") @Produces(MediaType.TEXT_PLAIN) public Response remove(@PathParam("id") Integer id) { logger.debug("Removing query"); engine.removeQuery(id); JSONObject ret = db.removeQuery(id); if (ret == null) { return Response.status(Response.Status.NOT_FOUND).build(); } logger.info("Query " + ret.getString("name") + " removed"); return Response.ok().build(); } }