package qa.qcri.aidr.manager.controller;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.validation.constraints.NotNull;
import javax.ws.rs.Consumes;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import qa.qcri.aidr.common.values.DownloadType;
import qa.qcri.aidr.common.wrapper.CollectionBriefInfo;
import qa.qcri.aidr.dbmanager.dto.taggerapi.TrainingDataDTO;
import qa.qcri.aidr.manager.dto.CrisisRequest;
import qa.qcri.aidr.manager.dto.ImageTaskQueueDTO;
import qa.qcri.aidr.manager.dto.ModelHistoryWrapper;
import qa.qcri.aidr.manager.dto.TaggerAttribute;
import qa.qcri.aidr.manager.dto.TaggerCrisis;
import qa.qcri.aidr.manager.dto.TaggerCrisisExist;
import qa.qcri.aidr.manager.dto.TaggerCrisisRequest;
import qa.qcri.aidr.manager.dto.TaggerCrisisType;
import qa.qcri.aidr.manager.dto.TaggerLabel;
import qa.qcri.aidr.manager.dto.TaggerLabelRequest;
import qa.qcri.aidr.manager.dto.TaggerModel;
import qa.qcri.aidr.manager.dto.TaggerModelFamily;
import qa.qcri.aidr.manager.dto.TaggerModelFamilyCollection;
import qa.qcri.aidr.manager.dto.TaggerResponseWrapper;
import qa.qcri.aidr.manager.dto.TaggerUser;
import qa.qcri.aidr.manager.dto.TaggerUserRequest;
import qa.qcri.aidr.manager.dto.TaskAnswer;
import qa.qcri.aidr.manager.dto.TaskAnswerRequest;
import qa.qcri.aidr.manager.dto.TaskInfo;
import qa.qcri.aidr.manager.dto.UpdateCrisisDTO;
import qa.qcri.aidr.manager.exception.AidrException;
import qa.qcri.aidr.manager.persistence.entities.Collection;
import qa.qcri.aidr.manager.persistence.entities.UserAccount;
import qa.qcri.aidr.manager.service.CollectionService;
import qa.qcri.aidr.manager.service.TaggerService;
import qa.qcri.aidr.manager.util.ManagerConfigurationProperty;
import qa.qcri.aidr.manager.util.ManagerConfigurator;
@Controller
@RequestMapping("protected/tagger")
public class TaggerController extends BaseController {
private final Logger logger = Logger.getLogger(TaggerController.class);
@Autowired
private TaggerService taggerService;
@Autowired
private CollectionService collectionService;
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
}
@RequestMapping(value = "/getAllCrisisTypes.action", method = {RequestMethod.GET})
@ResponseBody
public Map<String, Object> getAllCrisis() {
//logger.info("Getting all CrisisTypes from Tagger");
try {
return getUIWrapper(taggerService.getAllCrisisTypes(), true);
} catch (AidrException e) {
logger.error("Error while fetching all crisisTypes", e);
return getUIWrapper(false, e.getMessage());
}
}
@RequestMapping(value = "/getCrisesByUserId.action", method = {RequestMethod.GET})
@ResponseBody
public Map<String, Object> getCrisesByUserId() {
//logger.info("Getting crises from Tagger by User");
try {
String userName = getAuthenticatedUserName();
Integer taggerUserId = taggerService.isUserExistsByUsername(userName);
if (taggerUserId != null) {
return getUIWrapper(taggerService.getCrisesByUserId(taggerUserId), true);
} else {
return getUIWrapper(false, "Error while getting all crisis for user in Tagger");
}
} catch (Exception e) {
logger.error("Error while getting all crisis for current user", e);
return getUIWrapper(false, e.getMessage());
}
}
@RequestMapping(value = "/createCrises.action", method = {RequestMethod.POST})
@ResponseBody
public Map<String, Object> createCrises(CrisisRequest crisisRequest) {
//logger.info("Creating new crises in Tagger");
try {
String userName = getAuthenticatedUserName();
Integer taggerUserId = taggerService.isUserExistsByUsername(userName);
//logger.info("userID = " + taggerUserId + ", name = " + userName);
if (taggerUserId != null) {
TaggerCrisisRequest crisis = transformCrisesRequestToTaggerCrises(crisisRequest, taggerUserId);
logger.info("After transformation:, crisis = " + crisis.getCode() + ": " + crisis.getCrisisType() + ":" + crisis.getName());
String response = taggerService.createNewCrises(crisis);
//logger.info("createNewCrises: " + response);
if ("SUCCESS".equals(response)){
logger.info("Returning : " + response);
return getUIWrapper(true);
} else {
logger.info("Returning : " + response);
return getUIWrapper(false, response);
}
} else {
return getUIWrapper(false, "Unable to create new user in predict DB");
}
} catch (Exception e) {
logger.error("Error while creating new crisis", e);
return getUIWrapper(false, e.getMessage());
}
}
@RequestMapping(value = "/getAttributesForCrises.action", method = {RequestMethod.GET})
@ResponseBody
public Map<String, Object> getAttributesForCrises(Integer id) {
//logger.info("Getting Attributes For Crises");
try {
String userName = getAuthenticatedUserName();
Integer taggerUserId = taggerService.isUserExistsByUsername(userName);
return getUIWrapper(taggerService.getAttributesForCrises(id, taggerUserId), true);
} catch (Exception e) {
logger.error("Error while getting attributes for crisisId:"+id, e);
return getUIWrapper(false, e.getMessage());
}
}
@RequestMapping(value = "/addAttributeToCrisis.action", method = {RequestMethod.GET})
@ResponseBody
public Map<String, Object> addAttributeToCrisis(Integer crisesId, Integer attributeId, Boolean isActive) {
//logger.info("Add Attribute To Crises, received request for crisisID:" + crisesId + ", attributeID = " + attributeId + ", isActive = " + isActive);
try {
TaggerModelFamily modelFamily = transformCrisesIdAndAttributeIdToTaggerModelFamily(crisesId, attributeId, isActive);
if (modelFamily != null) {
//logger.info("Created modelFamily: crisis = " + modelFamily.getCrisis().getCrisisID() + ", attributeId = " + modelFamily.getNominalAttribute().getNominalAttributeID());
} else {
logger.warn("Something wrong, created modelFamily = null!!!");
}
Integer modelFamilyId = taggerService.addAttributeToCrisis(modelFamily);
if (modelFamilyId != null) {
//logger.info("success in adding attribute to crisis for modelFamily : " + modelFamilyId);
return getUIWrapper(modelFamilyId, true);
} else {
return getUIWrapper("Error while adding attribute to crises", false);
}
} catch (Exception e) {
logger.error("Error while adding attributes to crisisId: "+crisesId, e);
return getUIWrapper(false, e.getMessage());
}
}
@RequestMapping(value = "/updateCrisis.action", method = RequestMethod.POST)
@ResponseBody
public Map<String,Object> update(UpdateCrisisDTO dto) throws Exception {
//logger.info("Updating Crisis in Tagger having id " + dto.getCrisisID());
TaggerCrisis crisis = transformCrisisDTOToCrisis(dto);
try{
TaggerCrisis updatedCrisis = taggerService.updateCode(crisis);
// update collection crisisType to keep data consistent
Collection collection = collectionService.findByCode(dto.getCode());
//collection.setCrisisType(dto.getCrisisTypeID());
collectionService.update(collection);
return getUIWrapper(updatedCrisis != null);
}catch(Exception e){
logger.error("Error while Updating CrisisCode: "+dto.getCode(), e);
return getUIWrapper(false);
}
}
@RequestMapping(value = "/getModelsForCrisis.action", method = {RequestMethod.GET})
@ResponseBody
public Map<String, Object> getModelsForCrisis(Integer id) {
//logger.info("Getting Attributes For Crisis ID " + id);
try {
List<TaggerModel> result = taggerService.getModelsForCrisis(id);
return getUIWrapper(result, true);
} catch (AidrException e) {
logger.error("Error in getModelsForCrisis for id : " + id, e);
return getUIWrapper(false, e.getMessage());
}
}
@RequestMapping(value = "/getRetrainThreshold.action", method = {RequestMethod.GET})
@ResponseBody
public Map<String, Object> getRetrainThreshold() {
return getUIWrapper(ManagerConfigurator.getInstance().getProperty(ManagerConfigurationProperty.SAMPLE_COUNT_THRESHOLD), true);
}
@RequestMapping(value = "/getAllLabelsForModel.action", method = {RequestMethod.GET})
@ResponseBody
public Map<String, Object> getAllLabelsForModel(Integer id, String code) {
//logger.info("Getting All Labels For Model = " + id + ", and crisis = " + code);
try {
return getUIWrapper(taggerService.getAllLabelsForModel(id, code), true);
} catch (AidrException e) {
logger.error("Error while getting All Labels For Model = " + id + ", and crisis = " + code, e);
return getUIWrapper(false, e.getMessage());
}
}
@RequestMapping(value = "/createAttribute.action", method = {RequestMethod.POST})
@ResponseBody
public Map<String, Object> createAttribute(TaggerAttribute attribute) {
//logger.info("Creating new attribute in Tagger");
try {
String userName = getAuthenticatedUserName();
Integer taggerUserId = taggerService.isUserExistsByUsername(userName);
TaggerUser taggerUser = new TaggerUser(taggerUserId);
attribute.setUsers(taggerUser);
TaggerAttribute response = taggerService.createNewAttribute(attribute);
if (response != null){
return getUIWrapper(response, true);
} else {
return getUIWrapper(false, "Error while creating new attribute in Tagger");
}
} catch (Exception e) {
logger.error("Error while creating a new attribute", e);
return getUIWrapper(false, e.getMessage());
}
}
@RequestMapping(value = "/getAttributeInfo.action", method = {RequestMethod.GET})
@ResponseBody
public Map<String, Object> getAttributeInfo(@RequestParam Integer id) {
//logger.info("Get attribute by Id");
try {
TaggerAttribute response = taggerService.getAttributeInfo(id);
if (response != null){
return getUIWrapper(response, true);
} else {
return getUIWrapper(false, "Error while getting attribute from Tagger");
}
} catch (Exception e) {
logger.error("Error while getting attribute info for attributeId:"+id, e);
return getUIWrapper(false, e.getMessage());
}
}
@RequestMapping(value = "/deleteAttribute.action", method = {RequestMethod.GET})
@ResponseBody
public Map<String, Object> deleteAttribute(@RequestParam Integer id) {
//logger.info("Delete attribute by Id");
try {
boolean success = taggerService.deleteAttribute(id);
if (success){
return getUIWrapper(true, "Attribute was successful deleted");
} else {
return getUIWrapper(false, "Error while deleting attribute in Tagger");
}
} catch (Exception e) {
logger.error("Error while deleting attributeId: "+id, e);
return getUIWrapper(false, e.getMessage());
}
}
@RequestMapping(value = "/removeAttributeFromCrises.action", method = {RequestMethod.GET})
@ResponseBody
public Map<String, Object> removeAttributeFromCrises(@RequestParam Integer id) {
//logger.info("Remove classifier from crises by modelFamilyID");
try {
boolean success = taggerService.removeAttributeFromCrises(id);
if (success){
return getUIWrapper(true, "Classifier was successful removed from crisis");
} else {
return getUIWrapper(false, "Error while remove classifier from crises in Tagger");
}
} catch (Exception e) {
logger.error("Error while removing classifier from crises by modelFamilyID: "+id, e);
return getUIWrapper(false, e.getMessage());
}
}
@RequestMapping(value = "/updateAttribute.action", method = RequestMethod.POST)
@ResponseBody
public Map<String,Object> updateAttribute(@RequestParam Integer attributeID, @RequestParam String attributeName) throws Exception {
//logger.info("Updating Attribute in Tagger having id " + attributeID);
try{
TaggerAttribute response = taggerService.getAttributeInfo(attributeID);
TaggerAttribute updatedAttribute;
if (response != null && attributeName != null){
response.setName(attributeName);
response.setNominalLabelCollection(null);
updatedAttribute = taggerService.updateAttribute(response);
} else {
return getUIWrapper(false, "Error while updating attribute in Tagger");
}
return getUIWrapper(updatedAttribute != null);
}catch(Exception e){
logger.error("Updating Attribute in Tagger having id " + attributeID, e);
return getUIWrapper(false);
}
}
@RequestMapping(value = "/updateLabel.action", method = RequestMethod.POST)
@ResponseBody
public Map<String,Object> updateLabel(@RequestParam Integer labelID,
@RequestParam String labelName,
@RequestParam String labelDescription,
@RequestParam Integer attributeID) throws Exception {
//logger.info("Updating Label in Tagger having id " + labelID);
try{
TaggerLabel response = taggerService.getLabelInfo(labelID);
TaggerLabel updatedLabel;
if (response != null && (labelName != null || labelDescription != null)){
TaggerLabelRequest dto = new TaggerLabelRequest();
dto.setName(labelName);
dto.setDescription(labelDescription);
dto.setNominalAttributeID(attributeID);
dto.setNominalLabelCode(response.getNominalLabelCode());
dto.setNominalLabelID(response.getNominalLabelID());
updatedLabel = taggerService.updateLabel(dto);
} else {
return getUIWrapper(false, "Error while updating label in Tagger");
}
return getUIWrapper(updatedLabel != null);
}catch(Exception e){
logger.error("Error while updating label having id: "+labelID, e);
return getUIWrapper(false);
}
}
@RequestMapping(value = "/createLabel.action", method = {RequestMethod.POST})
@ResponseBody
public Map<String, Object> createLabel(TaggerLabelRequest labelRequest) {
//logger.info("Creating new label in Tagger");
try {
TaggerLabel response = taggerService.createNewLabel(labelRequest);
if (response != null){
return getUIWrapper(response, true);
} else {
return getUIWrapper(false, "Error while creating a new label in Tagger");
}
} catch (Exception e) {
logger.error("Error while creating a new label", e);
return getUIWrapper(false, e.getMessage());
}
}
@RequestMapping(value = "/attribute-exists.action", method = RequestMethod.GET)
@ResponseBody
public Map<String,Object> attributeExists(@RequestParam String code) throws Exception {
TaggerAttribute attribute = taggerService.attributeExists(code);
if (attribute != null && attribute.getNominalAttributeID() != null && attribute.getNominalAttributeID() != 0){
return getUIWrapper(true, true);
} else {
return getUIWrapper(false, true);
}
}
@RequestMapping(value = "/getTrainingDataByModelIdAndCrisisId.action", method = RequestMethod.GET)
@ResponseBody
public Map<String, Object> getTrainingDataByModelIdAndCrisisId(@RequestParam Integer start,
@RequestParam Integer limit,
@RequestParam Integer modelFamilyId,
@RequestParam Integer crisisId,
@RequestParam (value = "sortColumn", required = false, defaultValue = "") String sortColumn,
@RequestParam (value = "sortDirection", required = false, defaultValue = "") String sortDirection) throws Exception {
if (modelFamilyId == null || crisisId == null ) {
logger.error("Error while Getting training data for Crisis and Model. Model ID or Crisis ID is empty");
return getUIWrapper(false);
}
start = (start != null) ? start : 0;
limit = (limit != null) ? limit : 20;
List<TrainingDataDTO> response;
try {
response = taggerService.getTrainingDataByModelIdAndCrisisId(modelFamilyId, crisisId, start, limit, sortColumn, sortDirection);
//logger.info("For crisis ID " + crisisId + ", model family ID " + modelFamilyId + ", Returned response: " + response);
} catch (AidrException e) {
logger.error("Error while Getting training data for CrisisID: "+crisisId+ " and ModelFamilyID: "+modelFamilyId, e);
return getUIWrapper(false, e.getMessage());
}
Integer total = 0;
if (response != null) {
total = response.get(0).getTotalRows();
}
logger.info("Returning for crisis ID " + crisisId + ", model family ID " + modelFamilyId + " total count = " + total + ", response data: " + response);
return getUIWrapper(response, true, Long.valueOf(total), null);
}
@RequestMapping(value = "/getTrainingDataCountByModelIdAndCrisisId.action", method = RequestMethod.GET)
@ResponseBody
public Map<String, Object> getTrainingDataCountByModelIdAndCrisisId(
@RequestParam Integer modelFamilyId,
@RequestParam Integer crisisId) {
Integer start = 0;
Integer limit = 1;
List<TrainingDataDTO> response;
//logger.info("request received for crisis ID " + crisisId + ", model family ID " + modelFamilyId);
try {
response = taggerService.getTrainingDataByModelIdAndCrisisId(modelFamilyId, crisisId, start, limit, "", "");
//logger.info("received response back: " + response);
} catch (AidrException e) {
logger.error("Error in getTrainingDataCountByModelIdAndCrisisId for crisisId : " + crisisId + " and modelFamilyId : " + modelFamilyId, e);
return getUIWrapper(new Integer(0), false);
}
Integer total = 0;
if (response != null && !response.isEmpty()) {
total = response.get(0).getTotalRows();
}
logger.info("Returning for crisis ID " + crisisId + ", model family ID " + modelFamilyId + ", human labeled count = " + total);
return getUIWrapper(total, true);
}
@RequestMapping(value = "/getTaggedImageDataByCrisisId.action", method = RequestMethod.GET)
@ResponseBody
public Map<String, Object> getTaggedImageDataByCrisisId(@RequestParam Integer start,
@RequestParam Integer limit,
@RequestParam Integer crisisId,
@RequestParam (value = "sortColumn", required = false, defaultValue = "") String sortColumn,
@RequestParam (value = "sortDirection", required = false, defaultValue = "") String sortDirection) throws Exception {
if (crisisId == null ) {
logger.error("Error while Getting image data for Crisis - Crisis ID is empty");
return getUIWrapper(false);
}
start = (start != null) ? start : 0;
limit = (limit != null) ? limit : 20;
List<ImageTaskQueueDTO> response;
try {
response = taggerService.getTaggedImageDataByCrisisId(crisisId, start, limit, sortColumn, sortDirection);
//logger.info("For crisis ID " + crisisId + ", model family ID " + modelFamilyId + ", Returned response: " + response);
} catch (AidrException e) {
logger.error("Error while Getting training data for CrisisID: "+crisisId, e);
return getUIWrapper(false, e.getMessage());
}
Long total = 0L;
if (response != null) {
total = response.get(0).getTotalRows();
}
logger.info("Returning for crisis ID " + crisisId + " total count = " + total + ", response data: " + response);
return getUIWrapper(response, true, total, null);
}
@RequestMapping(value = "/getTaggedImageDataCountByCrisisId.action", method = RequestMethod.GET)
@ResponseBody
public Map<String, Object> getTaggedImageDataCountByCrisisId(@RequestParam Integer crisisId) {
Integer start = 0;
Integer limit = 1;
Long total = taggerService.getTaggedImageCount(crisisId);
if(total == null)
return getUIWrapper(new Integer(0), false);
logger.info("Returning for crisis ID " + crisisId + ", tagged images count = " + total);
return getUIWrapper(total, true);
}
@RequestMapping(value = "/crisis-exists.action", method = RequestMethod.GET)
@ResponseBody
public Map<String,Object> crisisExists(@RequestParam String code) throws Exception {
TaggerCrisisExist taggerCrisisExist = null;
//logger.info("Received request for crisis code: " + code);
try {
taggerCrisisExist = taggerService.isCrisesExist(code);
} catch (AidrException e) {
logger.error("Error while checking if crisis exist for the code: "+code +"\t"+e.getStackTrace());
return getUIWrapper(false);
}
if (taggerCrisisExist != null && taggerCrisisExist.getCrisisId() != null && taggerCrisisExist.getCrisisId() != 0){
logger.info("Classifier already exists for the code: \"" + code + "\"");
return getUIWrapper(true, true);
} else {
logger.info("Classifier doesn't exists yet for the code: \"" + code + "\"");
return getUIWrapper(false, true);
}
}
@RequestMapping(value = "/getAssignableTask.action", method = RequestMethod.GET)
@ResponseBody
public Map<String,Object> getAssignableTask(@RequestParam Integer id) throws Exception {
try {
//logger.info("Get Assignable Task is started with crisis id: " + id);
String userName = getAuthenticatedUserName();
String sVar = taggerService.getAssignableTask(id, userName);
//logger.info("sVar : " + sVar);
return getUIWrapper(sVar, true);
} catch (AidrException e) {
logger.error("Error while getting assignable task for crisisID: "+id +"\t"+e.getStackTrace());
return getUIWrapper(e.getMessage(), false);
}
}
@RequestMapping(value = "/skipTask.action", method = RequestMethod.GET)
@ResponseBody
public Map<String,Object> skipTask(@RequestParam Integer id) throws Exception {
try {
//logger.info("Skip Task for document id: " + id);
String userName = getAuthenticatedUserName();
String sVar = taggerService.skipTask(id, userName);
//logger.info("sVar : " + sVar);
return getUIWrapper(sVar, true);
} catch (AidrException e) {
logger.error("Error ehile skipping task for documentID: "+id +"\t"+e.getStackTrace());
return getUIWrapper(e.getMessage(), false);
}
}
@RequestMapping(value = "/getTemplateStatus.action", method = RequestMethod.GET)
@ResponseBody
public Map<String,Object> getTemplateStatus(@RequestParam String code) throws Exception {
try {
//logger.info("Get Template Status for crisis with code: " + code);
String sVar = taggerService.getTemplateStatus(code);
//logger.info("sVar : " + sVar);
return getUIWrapper(sVar, true);
} catch (AidrException e) {
logger.error("Error while getting template status for crisis with code: " + code +"\t"+e.getStackTrace());
return getUIWrapper(e.getMessage(), false);
}
}
@RequestMapping(value = "/saveTaskAnswer.action", method = {RequestMethod.POST})
@ResponseBody
public Map<String, Object> saveTaskAnswer(TaskAnswerRequest taskAnswerRequest) {
//logger.info("Saving TaskAnswer in AIDRCrowdsourcing");
try {
String userName = getAuthenticatedUserName();
Integer taggerUserId = taggerService.isUserExistsByUsername(userName);
if (taggerUserId == null) {
logger.error("Saving TaskAnswer - can not find Tagger user by User name");
return getUIWrapper(false, "Saving TaskAnswer - can not find Tagger user by User name");
}
List<TaskAnswer> taskAnswer = transformTaskAnswerRequestToTaskAnswer(taskAnswerRequest, taggerUserId);
boolean result = taggerService.saveTaskAnswer(taskAnswer);
return getUIWrapper(result);
} catch (Exception e) {
logger.error("Error while saving TaskAnswer in AIDRCrowdsourcing", e);
return getUIWrapper(false, e.getMessage());
}
}
@RequestMapping(value = "/loadLatestTweets.action", method = RequestMethod.GET)
@ResponseBody
public Map<String,Object> loadLatestTweets(@RequestParam String code, @RequestParam String constraints) throws Exception {
String result = "";
try {
result = taggerService.loadLatestTweets(code, constraints);
} catch (Exception e) {
logger.error("Exception while loading latest tweets for collection: "+code,e);
return getUIWrapper(false, "System is down or under maintenance. For further inquiries please contact admin.");
}
return getUIWrapper(result,true);
}
@RequestMapping(value = "/modelHistory.action", method = RequestMethod.GET)
@ResponseBody
public Map<String, Object> getModelHistoryByModelFamilyID(@RequestParam Integer start, @RequestParam Integer limit, @RequestParam Integer id,
@RequestParam (value = "sortColumn", required = false, defaultValue = "") String sortColumn,
@RequestParam (value = "sortDirection", required = false, defaultValue = "") String sortDirection) throws Exception {
if (id == null) {
logger.error("Error while Getting history records for Model by ModelFamilyId. ModelFamilyId is empty");
return getUIWrapper(false);
}
start = (start != null) ? start : 0;
limit = (limit != null) ? limit : 50;
try {
ModelHistoryWrapper result = taggerService.getModelHistoryByModelFamilyID(start, limit, id, sortColumn, sortDirection);
if (result != null) {
logger.info("Tagger returned " + result.getTotal() + " history records for model with modelFamilyID: " + id);
return getUIWrapper(result.getModelHistoryWrapper(), result.getTotal());
} else {
return getUIWrapper(Collections.emptyList(), 0L);
}
} catch (Exception e) {
logger.error("Error while getting history records for Model by ModelFamilyId: "+id,e);
return getUIWrapper(false, "System is down or under maintenance. For further inquiries please contact admin.");
}
}
@RequestMapping(value = "/deleteTrainingExample.action", method = {RequestMethod.GET})
@ResponseBody
public Map<String, Object> deleteTrainingExample(@RequestParam Integer id) {
//logger.info("Delete Training Example by Id");
try {
boolean success = taggerService.deleteTrainingExample(id);
if (success){
return getUIWrapper(true, "Training Example was successful deleted");
} else {
return getUIWrapper(false, "Error while deleting Training Example in Tagger");
}
} catch (Exception e) {
logger.error("Error while deleting Training Example by ID:"+id, e);
return getUIWrapper(false, e.getMessage());
}
}
@RequestMapping(value = "/pingService.action", method = RequestMethod.GET)
@ResponseBody
public Map<String,Object> pingService(@RequestParam String service) throws Exception {
//logger.info("In pinging service of every module");
boolean result = false;
try {
if ("tagger".equals(service)) {
result = taggerService.pingTagger();
} else if ("collector".equals(service)) {
result = collectionService.pingCollector();
} else if ("trainer".equals(service)) {
result = taggerService.pingTrainer();
} else if ("AIDROutput".equals(service)) {
result = taggerService.pingAIDROutput();
} else if ("persister".equals(service)) {
result = taggerService.pingPersister();
}
} catch (Exception e) {
logger.error("Error while pinging all modules",e);
return getUIWrapper(false, "System is down or under maintenance. For further inquiries please contact admin.");
}
return getUIWrapper(result, true);
}
@RequestMapping(value = "/getAttributesAndLabelsByCrisisId.action", method = RequestMethod.GET)
@ResponseBody
public Map<String,Object> getAttributesAndLabelsByCrisisId(@RequestParam Integer id) throws Exception {
//logger.info("Getting attributes and labels by crisisID: "+id);
String result = "";
try {
result = taggerService.getAttributesAndLabelsByCrisisId(id);
} catch (Exception e) {
logger.error("Error while getting attributes and labels by crisisID: "+id, e);
return getUIWrapper(false, "System is down or under maintenance. For further inquiries please contact admin.");
}
return getUIWrapper(result,true);
}
// Added by koushik
@RequestMapping(value = "/taggerGenerateCSVLink.action", method = RequestMethod.GET)
@ResponseBody
public Map<String,Object> generateCSVLink(@RequestParam String code) throws Exception {
//logger.info("Received request for generating csv link for Collection: " + code);
Map<String, Object> result = null;
try {
result = taggerService.generateCSVLink(code);
if (result != null && result.get("url") != null) {
return getUIWrapper(result.get("url"),true);
} else {
return getUIWrapper(false, "Something wrong - no file generated!");
}
} catch (Exception e) {
logger.error("Error while generating csv link for colection: "+code +"/t"+e.getStackTrace());
return getUIWrapper(false, "System is down or under maintenance. For further inquiries please contact admin.");
}
}
// Added by koushik
@RequestMapping(value = "/taggerGenerateTweetIdsLink.action", method = RequestMethod.GET)
@ResponseBody
public Map<String,Object> generateTweetIdsLink(@RequestParam String code) throws Exception {
//System.out.println("[Controller generateTweetIdsLink] Received request for code: " + code);
//logger.info("Received request for generating tweetIds link for Collection: " + code);
Map<String, Object> result = null;
try {
result = taggerService.generateTweetIdsLink(code);
if (result != null && result.get("url") != null) {
System.out.println("Returning success fo collection: " + code + ", response: " + result);
return getUIWrapper(result.get("url"),true, null, (String)result.get("message"));
} else {
return getUIWrapper(false, "Something wrong - no file generated!");
}
} catch (Exception e) {
logger.error("Error while generating tweetIds link for colection: "+code +"/t"+e.getStackTrace());
return getUIWrapper(false, "System is down or under maintenance. For further inquiries please contact admin.");
}
//System.out.println("[Controller generateTweetIdsLink] Returning success: " + result);
//return getUIWrapper(result,true);
}
private TaggerCrisisRequest transformCrisesRequestToTaggerCrises (CrisisRequest request, Integer taggerUserId) throws Exception{
TaggerCrisisType crisisType = new TaggerCrisisType(request.getCrisisTypeID());
TaggerUserRequest taggerUser = new TaggerUserRequest(taggerUserId);
return new TaggerCrisisRequest(request.getCode(), request.getName(), crisisType, taggerUser);
}
private TaggerModelFamily transformCrisesIdAndAttributeIdToTaggerModelFamily (Integer crisesId, Integer attributeId, Boolean isActive) throws Exception{
TaggerCrisis crisis = new TaggerCrisis(crisesId);
TaggerAttribute nominalAttribute = new TaggerAttribute(attributeId);
//logger.info("crisis = " + crisis.getCrisisID() + ", attribute = " + nominalAttribute.getNominalAttributeID());
return new TaggerModelFamily(crisis, nominalAttribute, isActive);
}
private TaggerCrisis transformCrisisDTOToCrisis (UpdateCrisisDTO dto) throws Exception{
TaggerCrisis crisis = new TaggerCrisis(dto.getCrisisID());
if (dto.getCrisisTypeID() != null && dto.getCrisisTypeName() != null) {
TaggerCrisisType crisisType = new TaggerCrisisType(dto.getCrisisTypeID(), dto.getCrisisTypeName());
crisis.setCrisisType(crisisType);
}
return crisis;
}
private List<TaskAnswer> transformTaskAnswerRequestToTaskAnswer (TaskAnswerRequest taskAnswerRequest, Integer taggerUserId) {
List<TaskAnswer> result = new ArrayList<TaskAnswer>();
TaskAnswer taskAnswer = new TaskAnswer();
taskAnswer.setUser_id(taggerUserId);
TaskInfo taskInfo = new TaskInfo();
taskInfo.setDocumentID(taskAnswerRequest.getDocumentID());
taskInfo.setText("");
taskInfo.setCategory(taskAnswerRequest.getCategory());
taskInfo.setAidrID(taggerUserId);
taskInfo.setTweetid("");
taskInfo.setCrisisID(taskAnswerRequest.getCrisisID());
taskInfo.setAttributeID(taskAnswerRequest.getAttributeID());
taskAnswer.setInfo(taskInfo);
result.add(taskAnswer);
return result;
}
@RequestMapping(value = "/taggerGenerateJSONLink.action", method = RequestMethod.GET)
@ResponseBody
public Map<String,Object> generateJSONLink(@RequestParam String code,
@DefaultValue(DownloadType.TEXT_JSON) @QueryParam("jsonType") String jsonType) throws Exception {
//logger.info("Received request for generating JSON link for Collection: " + code);
Map<String, Object> result = null;
try {
result = taggerService.generateJSONLink(code, jsonType);
if (result != null && result.get("url") != null) {
return getUIWrapper(result.get("url"),true);
} else {
return getUIWrapper(false, "Something wrong - no file generated!");
}
} catch (Exception e) {
logger.error("Error while generating JSON link for colection: "+code +" & jsonType: "+jsonType+"/t"+e.getStackTrace());
return getUIWrapper(false, "System is down or under maintenance. For further inquiries please contact admin.");
}
//return getUIWrapper(result,true);
}
// Added by koushik
@RequestMapping(value = "/taggerGenerateJsonTweetIdsLink.action", method = RequestMethod.GET)
@ResponseBody
public Map<String,Object> generateJsonTweetIdsLink(@RequestParam String code,
@DefaultValue(DownloadType.TEXT_JSON) @QueryParam("jsonType") String jsonType) throws Exception {
//System.out.println("[Controller generateTweetIdsLink] Received request for code: " + code);
//logger.info("Received request for generating JSON TweetIds link for Collection: " + code);
Map<String, Object> result = null;
try {
result = taggerService.generateJsonTweetIdsLink(code, jsonType);
if (result != null && result.get("url") != null) {
//System.out.println("Returning success fo collection: " + code + ", response: " + result);
return getUIWrapper(result.get("url"),true, null, (String)result.get("message"));
} else {
return getUIWrapper(false, "Something wrong - no file generated!");
}
} catch (Exception e) {
logger.error("Error while generating JSON TweetIds link for colection: "+code +" & jsonType: "+jsonType+"/t"+e.getStackTrace());
return getUIWrapper(false, "System is down or under maintenance. For further inquiries please contact admin.");
}
//System.out.println("[Controller generateTweetIdsLink] Returning success: " + result);
//return getUIWrapper(result,true);
}
// Added by koushik
@RequestMapping(value = "/taggerGenerateCSVFilteredLink.action", method = RequestMethod.POST)
@ResponseBody
public Map<String,Object> generateCSVFilteredLink(@RequestParam String code,
@RequestParam Integer count,
@RequestParam boolean removeRetweet,
String queryString) throws Exception {
//logger.info("Received request for generating CSV filtered link for Collection: " + code);
Map<String, Object> result = null;
try {
UserAccount authenticatedUser = getAuthenticatedUser();
String userName = authenticatedUser.getUserName();
//Checking whether authenticated user can download tweets with full content
if(authenticatedUser.isDownloadPermitted()){
result = taggerService.generateCSVFilteredLink(code, queryString, userName, count, removeRetweet);
if (result != null && result.get("url") != null) {
return getUIWrapper(result.get("url"),true);
} else {
return getUIWrapper(false, "Something wrong - no file generated!");
}
}
else{
Collection collection = collectionService.findByCode(code);
UserAccount collectionOwner = collection.getOwner();
//Owner can download tweets with full content
if(userName.equalsIgnoreCase(collectionOwner.getUserName())){
result = taggerService.generateCSVFilteredLink(code, queryString, userName, count, removeRetweet);
if (result != null && result.get("url") != null) {
return getUIWrapper(result.get("url"),true);
} else {
return getUIWrapper(false, "Something wrong - no file generated!");
}
}
else{
return getUIWrapper(false, "User is not permitted to download full tweets csv");
}
}
} catch (Exception e) {
logger.error("Error while generating CSV filtered link for colection: "+code +"/t"+e.getStackTrace());
return getUIWrapper(false, "System is down or under maintenance. For further inquiries please contact admin.");
}
}
@RequestMapping(value = "/taggerGenerateTweetIdsFilteredLink.action", method = RequestMethod.POST)
@ResponseBody
public Map<String,Object> generateTweetIdsFilteredLink(@RequestParam String code,
@RequestParam Integer count,
@RequestParam boolean removeRetweet,
String queryString) throws Exception {
Map<String, Object> result = null;
try {
String userName = getAuthenticatedUserName();
if (null == userName) userName = "System";
//Uncomment to fetch TweetIds with classifier info
//result = taggerService.generateTweetIdsFilteredLink(code, queryString, userName);
//Fetch TweetIds only
result = taggerService.generateTweetIdsOnlyFilteredLink(code, queryString, userName, count, removeRetweet);
if (result != null && result.get("url") != null) {
return getUIWrapper(result.get("url"),true, null, (String)result.get("message"));
} else {
return getUIWrapper(false, "Something wrong - no file generated!");
}
} catch (Exception e) {
logger.error("Error while generating tweetIDs filtered link for colection: "+code +"/t"+e.getStackTrace());
return getUIWrapper(false, "System is down or under maintenance. For further inquiries please contact admin.");
}
}
@RequestMapping(value = "/taggerGenerateJSONFilteredLink.action", method = RequestMethod.POST)
@ResponseBody
public Map<String,Object> generateJSONFilteredLink(@RequestParam String code,
@RequestParam Integer count,
String queryString,
@RequestParam boolean removeRetweet,
@DefaultValue(DownloadType.TEXT_JSON) @QueryParam("jsonType") String jsonType) throws Exception {
Map<String, Object> result = null;
try {
UserAccount authenticatedUser = getAuthenticatedUser();
String userName = authenticatedUser.getUserName();
//Checking whether authenticatedUser can download tweets with full content
if(authenticatedUser.isDownloadPermitted()){
result = taggerService.generateJSONFilteredLink(code, queryString, jsonType, userName, count, removeRetweet);
if (result != null && result.get("url") != null) {
return getUIWrapper(result.get("url"),true);
} else {
return getUIWrapper(false, "Something wrong - no file generated!");
}
}
else{
Collection collection = collectionService.findByCode(code);
UserAccount collectionOwner = collection.getOwner();
//Owner can download tweets with full content
if(userName.equalsIgnoreCase(collectionOwner.getUserName())){
result = taggerService.generateJSONFilteredLink(code, queryString, jsonType, userName, count, removeRetweet);
if (result != null && result.get("url") != null) {
return getUIWrapper(result.get("url"),true);
} else {
return getUIWrapper(false, "Something wrong - no file generated!");
}
}else{
return getUIWrapper(false, "User is not permitted to download full tweets Json");
}
}
} catch (Exception e) {
logger.error("Error while generating JSON filtered link for colection: "+code +"/t"+e.getStackTrace());
return getUIWrapper(false, "System is down or under maintenance. For further inquiries please contact admin.");
}
}
@RequestMapping(value = "/taggerGenerateJsonTweetIdsFilteredLink.action", method = RequestMethod.POST)
@ResponseBody
public Map<String,Object> generateJsonTweetIdsFilteredLink(@RequestParam String code,
String queryString, @RequestParam boolean removeRetweet, @RequestParam Integer count,
@DefaultValue(DownloadType.TEXT_JSON) @QueryParam("jsonType") String jsonType) throws Exception {
//logger.info("Received request for generating JSON TweetIds filtered link for Collection: " + code);
Map<String, Object> result = null;
try {
String userName = getAuthenticatedUserName();
if (null == userName) userName = "System";
//Uncomment to fetch TweetIds with classifier info
//result = taggerService.generateJsonTweetIdsFilteredLink(code, queryString, jsonType, userName);
//Fetch TweetIds only
result = taggerService.generateJsonTweetIdsOnlyFilteredLink(code, queryString, jsonType, userName, count, removeRetweet);
if (result != null && result.get("url") != null) {
return getUIWrapper(result.get("url"),true, null, (String)result.get("message"));
} else {
return getUIWrapper(false, "Something wrong - no file generated!");
}
} catch (Exception e) {
logger.error("Error while generating JSON TweetIds filtered link for colection: "+code +" & jsonType: "+jsonType+"/t"+e.getStackTrace());
return getUIWrapper(false, "System is down or under maintenance. For further inquiries please contact admin.");
}
}
@RequestMapping(value = "/updateMobilePush.action", method = { RequestMethod.POST ,RequestMethod.GET })
@ResponseBody
public Map<String,Object> updateMobilePushStatus(Collection collection) throws Exception {
//logger.info("[updateMobilePushStatus: " + collection.getCode());
String result = "";
try {
TaggerCrisis tagCrisis = taggerService.getCrisesByCode(collection.getCode());
List<TaggerModelFamilyCollection> taggerModelFamilies = tagCrisis.getModelFamilyCollection();
/// all clientapp based on crisisID should be enable to push to mobile app.
} catch (Exception e) {
logger.error("Error while updating mobile push status for colection: "+collection.getCode() +"/t"+e.getStackTrace());
return getUIWrapper(false, "System is down or under maintenance. For further inquiries please contact admin.");
}
return getUIWrapper(result,true);
}
@RequestMapping(value = "/getHumanLabeledDocumentsByCrisisID.action", method = RequestMethod.GET)
@ResponseBody
public Map<String,Object> getHumanLabeledDocumentsByCrisisID(Long crisisID, Integer count) throws Exception {
try {
//logger.info("Getting human labelled documents by crisisID: "+crisisID);
TaggerResponseWrapper labeledDataList = taggerService.getHumanLabeledDocumentsByCrisisID(crisisID, count);
return getUIWrapper(labeledDataList, true);
} catch (Exception e) {
logger.error("Error while getting human labelled documents by crisisID: "+crisisID +"/t"+e.getStackTrace());
return getUIWrapper(false, "Error in fetching human labeled documents");
}
}
@RequestMapping(value = "/getHumanLabeledDocumentsByCrisisCode.action", method = RequestMethod.GET)
@ResponseBody
public Map<String,Object> getHumanLabeledDocumentsByCrisisCode(String crisisCode, Integer count) throws Exception {
try {
//logger.info("Getting human labelled documents by crisisCode: "+crisisCode);
TaggerResponseWrapper labeledDataList = taggerService.getHumanLabeledDocumentsByCrisisCode(crisisCode, count);
return getUIWrapper(labeledDataList, true);
} catch (Exception e) {
logger.error("Error while getting human labelled documents by crisisCode: "+crisisCode +"/t"+e.getStackTrace());
return getUIWrapper(false, "Error in fetching human labeled documents");
}
}
@RequestMapping(value = "/getHumanLabeledDocumentsByCrisisIDUserID.action", method = RequestMethod.GET)
@ResponseBody
public Map<String,Object> getHumanLabeledDocumentsByCrisisIDUserID(Long crisisID, Long userID, Integer count) throws Exception {
try {
//logger.info("Getting human labelled documents by crisisID: "+crisisID +" & userID: "+userID);
TaggerResponseWrapper labeledDataList = taggerService.getHumanLabeledDocumentsByCrisisIDUserID(crisisID, userID, count);
return getUIWrapper(labeledDataList, true);
} catch (Exception e) {
logger.error("Error while getting human labelled documents by crisisID: "+crisisID +" & userID: "+userID+"/t"+e.getStackTrace());
return getUIWrapper(false, "Error in fetching human labeled documents");
}
}
@RequestMapping(value = "/getHumanLabeledDocumentsByCrisisIDUserName.action", method = RequestMethod.GET)
@ResponseBody
public Map<String,Object> getHumanLabeledDocumentsByCrisisIDUserName(Long crisisID, String userName, Integer count) throws Exception {
try {
//logger.info("Getting human labelled documents by crisisID: "+crisisID +" & userName: "+userName);
TaggerResponseWrapper labeledDataList = taggerService.getHumanLabeledDocumentsByCrisisIDUserName(crisisID, userName, count);
return getUIWrapper(labeledDataList, true);
} catch (Exception e) {
logger.error("Error while getting human labelled documents by crisisID: "+crisisID +" & userName: "+userName+"/t"+e.getStackTrace());
return getUIWrapper(false, "Error in fetching human labeled documents");
}
}
@RequestMapping(value = "/downloadHumanLabeledDocuments.action", method = RequestMethod.POST)
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@ResponseBody
public Map<String,Object> downloadHumanLabeledDocuments(String queryString,
@RequestParam(value = "crisisCode", required = true) String crisisCode,
@RequestParam(value = "count", defaultValue = "-1") Integer count,
@RequestParam(value = "fileType", defaultValue = DownloadType.TEXT_JSON) String fileType,
@RequestParam(value = "contentType", defaultValue = DownloadType.FULL_TWEETS) String contentType) throws Exception {
//logger.info("Received request: crisisCode = " + crisisCode + ", count = " + count + ", fileType = " + fileType
// + ", contentType = " + contentType + "\nquery String = " + queryString);
try {
String userName = getAuthenticatedUserName();
if (null == userName) userName = "System";
if (null == count) {
count = -1;
}
Map<String, Object> downloadLink = taggerService.downloadHumanLabeledDocumentsByCrisisUserName(queryString, crisisCode, userName, count, fileType, contentType);
if (downloadLink.get("fileName") != null && downloadLink.get("total") != null) {
return getUIWrapper(downloadLink, true, new Long((Integer)downloadLink.get("total")), null);
} else {
return getUIWrapper(downloadLink, false);
}
} catch (Exception e) {
logger.error("Error while downloading human labelled documents for crisis: "+crisisCode + " , fileType: "+fileType + " & queryString: "+queryString +"/t"+e.getStackTrace());
return getUIWrapper(false, "Error in getting download link for human labeled documents");
}
}
@RequestMapping(value = "/updateMicromapperEnabled.action", method = RequestMethod.POST)
@ResponseBody
public Map<String,Object> updateMicromapperEnabled(@RequestParam Boolean isMicromapperEnabled, @RequestParam String code ) throws Exception {
//logger.info("In update micromapperEnabled for collection, code = " + code);
try {
Collection collectionToUpdate = collectionService.findByCode(code);
if (collectionToUpdate != null) {
collectionToUpdate.setMicromappersEnabled(isMicromapperEnabled);
collectionService.update(collectionToUpdate);
}
return getUIWrapper(null,true);
} catch (Exception e) {
logger.error("Error while updating isMicromapperEnabled flag for crisis: "+code ,e);
return getUIWrapper(false, "Unable to update micromapperEnabled for collection, code = " + code);
}
}
/**
* @param url
* @param mailType Type of mail (issues/suggestions)
* @return
* @throws Exception
*/
@RequestMapping(value = "/sendEmailService.action", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> sendEmail(@RequestParam String url, @RequestParam String mailType, @RequestParam String description) throws Exception {
//logger.info("In sending email");
UserAccount userEntity = getAuthenticatedUser();
userEntity.getUserName();
StringBuffer body = new StringBuffer("User:").append(userEntity.getUserName())
.append("\nURL:").append(url).append("\nRequestHeader:").append(description);
String subject = mailType;
Boolean result = false;
try{
result = taggerService.sendMailService(subject,body.toString());
if (result) {
return getUIWrapper(null,true);
} else {
return getUIWrapper(false, "Sending Email Failed");
}
}catch (Exception e) {
logger.error("Error while sending emails to developers", e);
return getUIWrapper(false, "Sending Email Failed");
}
}
@RequestMapping(value = "/generateFacebookPostDownloadLink", method = RequestMethod.POST)
@ResponseBody
public Map<String,Object> generateFacebookPostDownloadLink(@RequestParam String code,
@RequestParam Integer count) throws Exception {
Map<String, Object> result = null;
try {
result = taggerService.generateFacebookPostDownloadLink(code, count);
if (result != null && result.get("url") != null) {
return getUIWrapper(result.get("url"),true);
} else {
return getUIWrapper(false, "Something wrong - no file generated!");
}
} catch (Exception e) {
logger.error("Error while generating CSV filtered link for colection: "+code +"/t"+e.getStackTrace());
return getUIWrapper(false, "System is down or under maintenance. For further inquiries please contact admin.");
}
}
@RequestMapping(value = "/attribute/{attributeId}/collections", method = {RequestMethod.GET})
@ResponseBody
public Map<String, Object> getCollectionsByAttribute(@PathVariable Long attributeId, @RequestParam Long collectionId) {
try {
List<CollectionBriefInfo> collections = taggerService.fetchCollectionsByAttribute(attributeId, collectionId);
return getUIWrapper(collections, true);
} catch (Exception e) {
logger.error("Error while fetching all crisisTypes", e);
return getUIWrapper(false, "Error in fetching data.");
}
}
@RequestMapping(value = "/import/training-set", method = { RequestMethod.POST })
@ResponseBody
public Map<String, Object> importTrainingSet(@RequestParam @NotNull Long targetCollectionId,
@RequestParam String sourceCollectionCode, @RequestParam Long attributeId) {
try {
taggerService.importTrainingData(targetCollectionId, sourceCollectionCode, attributeId);
return getUIWrapper("Crisis Training Set imported sucessfully !!", true);
} catch (Exception e) {
logger.error("Error while importing training set.", e);
return getUIWrapper(false, "Error in fetching data.");
}
}
}