/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package qa.qcri.aidr.predictui.api;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
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.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.apache.log4j.Logger;
import qa.qcri.aidr.common.exception.PropertyNotSetException;
import qa.qcri.aidr.dbmanager.dto.CollectionDTO;
import qa.qcri.aidr.predictui.facade.CrisisResourceFacade;
import qa.qcri.aidr.predictui.util.ResponseWrapper;
import qa.qcri.aidr.predictui.util.TaggerAPIConfigurationProperty;
import qa.qcri.aidr.predictui.util.TaggerAPIConfigurator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonParser;
/**
* REST Web Service
*
* @author Imran
*/
@Path("/crisis")
@Stateless
public class CrisisResource {
//private Logger logger = Logger.getLogger(CrisisResource.class.getName());
private Logger logger = Logger.getLogger(CrisisResource.class);
@Context
private UriInfo context;
@EJB
private CrisisResourceFacade crisisLocalEJB;
public CrisisResource() {
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("{id}")
public Response getCrisisByID(@PathParam("id") Long id) {
CollectionDTO collection = null;
try {
collection = crisisLocalEJB.getCrisisByID(id);
System.out.println("fetched collection for id " + id + ": " + (collection != null ? collection.getCode() : "null"));
} catch (RuntimeException e) {
logger.error("Error in getCrisisById for collection id : " + id);
return Response.ok(new ResponseWrapper(TaggerAPIConfigurator.getInstance().getProperty(TaggerAPIConfigurationProperty.STATUS_CODE_FAILED), e.getCause().getCause().getMessage())).build();
}
ObjectMapper mapper = new ObjectMapper();
try {
return Response.ok(mapper.writeValueAsString(collection)).build();
} catch (JsonProcessingException e) {
// TODO Auto-generated catch block
logger.error("Error in Json processing.");
return Response.ok(new ResponseWrapper(TaggerAPIConfigurator.getInstance().getProperty(TaggerAPIConfigurationProperty.STATUS_CODE_FAILED), e.getCause().getCause().getMessage())).build();
}
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/by-code/{code}")
public Response getCrisisByCode(@PathParam("code") String crisisCode) {
CollectionDTO collection = null;
ResponseWrapper response = new ResponseWrapper();
try {
collection = crisisLocalEJB.getCrisisByCode(crisisCode);
logger.info("For code = " + crisisCode + ", Returning crisis: " + (collection != null ? collection.getCode() : "null"));
if (collection != null) {
response.setDataObject(collection);
response.setTotal(1);
response.setStatusCode(TaggerAPIConfigurator.getInstance().getProperty(TaggerAPIConfigurationProperty.STATUS_CODE_SUCCESS));
return Response.ok(response).build();
} else {
response.setDataObject(null);
response.setTotal(0);
response.setStatusCode(TaggerAPIConfigurator.getInstance().getProperty(TaggerAPIConfigurationProperty.STATUS_CODE_SUCCESS));
return Response.ok(response).build();
}
} catch (RuntimeException e) {
response.setDataObject(null);
response.setTotal(0);
response.setStatusCode(TaggerAPIConfigurator.getInstance().getProperty(TaggerAPIConfigurationProperty.STATUS_CODE_FAILED));
response.setMessage(e.getCause().getCause().getMessage());
logger.error("Error in getCrisisByCode for code : " + crisisCode);
return Response.ok(response).build();
}
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/code/{code}")
public Response isCrisisExists(@PathParam("code") String crisisCode) {
CollectionDTO collection = crisisLocalEJB.getCrisisByCode(crisisCode);
long crisisId = 0;
// null value can not be correct deserialized
if (collection == null){
crisisId = 0;
} else {
crisisId = collection.getCrisisID();
}
Gson gson = new Gson();
Map<String, Object> result = new HashMap<String, Object>();
result.put("crisisCode", crisisCode);
result.put("crisisId", crisisId);
return Response.ok(gson.toJson(result)).build();
}
@POST
@Consumes( MediaType.APPLICATION_JSON )
@Produces( MediaType.APPLICATION_JSON )
@Path("/crises")
public Response getCrisesByCodes(String codes) {
try {
ObjectMapper objectMapper = new ObjectMapper();
JsonParser jsonParser = new JsonParser();
JsonArray jsonArr = (JsonArray)jsonParser.parse(codes);
ArrayList<String> jsonObjList = new Gson().fromJson(jsonArr, ArrayList.class);
HashMap<String, Integer> classifiersNumbers = crisisLocalEJB.countClassifiersByCrisisCodes(jsonObjList);
String rv = objectMapper.writeValueAsString(classifiersNumbers);
return Response.ok(classifiersNumbers).build();
} catch (IOException e) {
logger.error("Error while getting numbers of classifiers by crisis codes:", e);
return Response.ok("Error while getting numbers of classifiers by crisis codes.").build();
}
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/all")
public Response getAllCrisis() {
List<CollectionDTO> crisisList = crisisLocalEJB.getAllCrisis();
ResponseWrapper response = new ResponseWrapper();
response.setMessage(TaggerAPIConfigurator.getInstance().getProperty(TaggerAPIConfigurationProperty.STATUS_CODE_SUCCESS));
response.setCrisises(crisisList);
ObjectMapper mapper = new ObjectMapper();
logger.info("retreived crisis list: " + crisisList);
try {
return Response.ok(mapper.writeValueAsString(response)).build();
} catch (Exception e) {
logger.error("Error in getAllCrisis.");
return Response.ok(new ResponseWrapper(TaggerAPIConfigurator.getInstance().getProperty(TaggerAPIConfigurationProperty.STATUS_CODE_FAILED), e.getCause().getCause().getMessage())).build();
}
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public ResponseWrapper getAllCrisisByUserID(@QueryParam("userID") Long userID) throws Exception {
List<CollectionDTO> crisisList = crisisLocalEJB.getAllCrisisByUserID(userID);
logger.info("list of crisis for userID " + userID + ": " + (crisisList != null ? crisisList.size() : 0));
ResponseWrapper response = new ResponseWrapper();
if (crisisList == null) {
response.setMessage("No crisis found associated with the given user id.");
return response;
}
response.setCrisises(crisisList);
return response;
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response addCrisis(CollectionDTO crisis) {
try {
logger.info("Received request to add crisis: " + crisis.getCode());
if (crisisLocalEJB.isCrisisExists(crisis.getCode())) {
logger.warn("Crisis with code = " + crisis.getCode() + " already has at least one classifier attached!");
return Response.ok(TaggerAPIConfigurator.getInstance().getProperty(TaggerAPIConfigurationProperty.STATUS_CODE_SUCCESS)).build();
}
// Otherwise, add the new crisis to aidr_predict database
crisis.setIsTrashed(false);
CollectionDTO newCollection = crisisLocalEJB.addCrisis(crisis);
logger.info("Added crisis successfully: id = " + newCollection.getCrisisID() + ", " + newCollection.getCode());
return Response.ok(TaggerAPIConfigurator.getInstance().getProperty(TaggerAPIConfigurationProperty.STATUS_CODE_SUCCESS)).build();
} catch (RuntimeException e) {
logger.error("Error while adding Crisis. Possible causes could be duplication of primary key, incomplete data, incompatible data format. For crisis: " + crisis.getCode(), e);
return Response.ok("Error while adding Crisis. Possible causes could be duplication of primary key, incomplete data, incompatible data format.").build();
}
}
@PUT
@Consumes("application/json")
@Produces(MediaType.APPLICATION_JSON)
public Response editCrisis(CollectionDTO collection) {
try {
logger.info("Received request to edit crisis: " + collection.getCode());
CollectionDTO updatedCollection = crisisLocalEJB.editCrisis(collection);
return Response.ok(updatedCollection).build();
} catch (RuntimeException e) {
logger.error("Error in editCrisis for crisis code : " + collection.getCode());
return Response.ok(new ResponseWrapper(TaggerAPIConfigurator.getInstance().getProperty(TaggerAPIConfigurationProperty.STATUS_CODE_FAILED), e.getCause().getCause().getMessage())).build();
}
}
@GET
@Produces("application/json")
@Path("/attributes/count/{crisisCode}")
public Response getNominalAttributesCountForCrisis(@PathParam("crisisCode") String crisisCode) {
Map<String, Integer> result = new HashMap<String, Integer>(1);
ObjectMapper mapper = new ObjectMapper();
try {
if (crisisLocalEJB.isCrisisExists(crisisCode) != null) {
List<String> crisisList = new ArrayList<String>();
crisisList.add(crisisCode);
Map<String, Integer> retVal = crisisLocalEJB.countClassifiersByCrisisCodes(crisisList);
if (retVal != null) {
result.put("count", retVal.get(crisisCode) != null ? retVal.get(crisisCode) : 0);
logger.info("Generated response: " + result);
return Response.ok(mapper.writeValueAsString(result)).build();
}
}
result.put("count", 0);
return Response.ok(mapper.writeValueAsString(result)).build();
} catch (Exception e) {
logger.error("Error in getNominalAttributesCountForCrisis for crisis code : " + crisisCode);
result.put("count", -1);
return Response.ok(result).build();
}
}
@DELETE
@Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response deleteCrisis(@PathParam("id") Long id) throws PropertyNotSetException {
int crisisDeleted = crisisLocalEJB.deleteCrisis(id);
return crisisDeleted == 1 ? Response.ok(new ResponseWrapper(TaggerAPIConfigurator.getInstance().getProperty(TaggerAPIConfigurationProperty.STATUS_CODE_SUCCESS))).build() : Response.ok(new ResponseWrapper(TaggerAPIConfigurator.getInstance().getProperty(TaggerAPIConfigurationProperty.STATUS_CODE_FAILED))).build();
}
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/update/micromapperEnabled/{crisisCode}/{isMicromapperEnabled}")
public Response updateMicromapperEnabledByCrisisCode(@PathParam("crisisCode") String crisisCode,
@PathParam("isMicromapperEnabled") Boolean isMicromapperEnabled ) {
Map<String, Boolean> result = new HashMap<String, Boolean>(1);
ObjectMapper mapper = new ObjectMapper();
try {
CollectionDTO crisisDTO = crisisLocalEJB.getCrisisByCode(crisisCode);
crisisDTO.setIsMicromapperEnabled(isMicromapperEnabled);
crisisDTO = crisisLocalEJB.editCrisis(crisisDTO);
if(crisisDTO.isIsMicromapperEnabled()==isMicromapperEnabled){
result.put("isMicromapperEnabled", isMicromapperEnabled);
}
return Response.ok(mapper.writeValueAsString(result)).build();
} catch (Exception e) {
logger.error("Exception while updating isMicromapperEnabled " + e.getMessage());
return Response.ok("{\"status\": \"false\"}").build();
}
}
}