package qa.qcri.aidr.predictui.facade.imp;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import org.apache.log4j.Logger;
import qa.qcri.aidr.dbmanager.dto.CollectionDTO;
import qa.qcri.aidr.dbmanager.dto.DocumentDTO;
import qa.qcri.aidr.dbmanager.dto.ModelFamilyDTO;
import qa.qcri.aidr.dbmanager.ejb.remote.facade.TaskManagerRemote;
import qa.qcri.aidr.dbmanager.entities.model.ModelFamily;
import qa.qcri.aidr.dbmanager.entities.task.Document;
import qa.qcri.aidr.predictui.api.CollectionManagementResource;
import qa.qcri.aidr.predictui.facade.CrisisManagementResourceFacade;
@Stateless
public class CrisisManagementResourceFacadeImp implements CrisisManagementResourceFacade {
@EJB
private qa.qcri.aidr.dbmanager.ejb.remote.facade.DocumentResourceFacade remoteDocumentEJB;
@EJB
private qa.qcri.aidr.dbmanager.ejb.remote.facade.CollectionResourceFacade remoteCrisisEJB;
@EJB
private qa.qcri.aidr.dbmanager.ejb.remote.facade.ModelFamilyResourceFacade remoteModelFamilyEJB;
@EJB
private TaskManagerRemote<Document, Long> taskManager;
private static Logger logger = Logger.getLogger(CollectionManagementResource.class);
@Override
public String trashByCrisisCode(String crisisCode) {
//TODO:
// 1. set aidr_predict.crisis.isTrashed = true
// 2. set model_family.isActive = 0
// 3. remove tasks for this crisisID from document table -->
// this will trigger deletion of documents for this crisisID from
// the task_assignment table through DELETE CASCADE
logger.info("Received request to trash collection from aidr_predict DB: " + crisisCode);
try {
CollectionDTO collection = remoteCrisisEJB.getCrisisByCode(crisisCode);
logger.info("crisis found for crisis code " + crisisCode + ": " + collection);
if (null == collection) {
StringBuilder sb = new StringBuilder().append("{\"TRASHED\":").append(new Long(-1)).append("}");
logger.info("No crisis exists in aidr_predict DB for: " + crisisCode);
return sb.toString();
}
//Otherwise go ahead with trashing
List<ModelFamilyDTO> associatedModels = remoteModelFamilyEJB.getAllModelFamiliesByCrisis(collection.getCrisisID());
if (associatedModels.isEmpty()) {
StringBuilder sb = new StringBuilder().append("{\"TRASHED\":").append(collection.getCrisisID()).append("}");
logger.info("Success in deleting crisis: " + crisisCode);
return sb.toString();
}
List<ModelFamily> list = new ArrayList<ModelFamily>();
for (ModelFamilyDTO model: associatedModels) {
model.setIsActive(false);
list.add(model.toEntity());
}
remoteModelFamilyEJB.merge(list);
List<DocumentDTO> associatedDocumentsDTO = remoteDocumentEJB.findUnLabeledDocumentsByCrisisID(collection.getCrisisID());
if (associatedDocumentsDTO.isEmpty()) {
StringBuilder sb = new StringBuilder().append("{\"TRASHED\":").append(collection.getCrisisID()).append("}");
return sb.toString();
}
logger.info("Found for " + crisisCode + ", unlabeled docs to delete = " + associatedDocumentsDTO.size());
List<Document> associatedDocuments = new ArrayList<Document>();
try {
for (DocumentDTO documentDTO : associatedDocumentsDTO) {
associatedDocuments.add(documentDTO.toEntity());
}
taskManager.deleteTask(associatedDocuments);
} catch (Exception e) {
logger.error("Error in deleting document set");
}
List<DocumentDTO> temp = remoteDocumentEJB.findUnLabeledDocumentsByCrisisID(collection.getCrisisID());
logger.info("Post Trashing: found for " + crisisCode + ", unlabeled docs after delete = " + temp.size());
if (temp.isEmpty()) {
StringBuilder sb = new StringBuilder().append("{\"TRASHED\":").append(collection.getCrisisID()).append("}");
logger.info("Success in deleting crisis: " + crisisCode);
return sb.toString();
} else {
StringBuilder sb = new StringBuilder().append("{\"status\": \"FAILED\"}");
return sb.toString();
}
} catch (Exception e) {
logger.error("Something went wrong in trashing attempt!");
StringBuilder sb = new StringBuilder().append("{\"status\": \"FAILED\"}");
return sb.toString();
}
}
@Override
public String untrashByCrisisCode(String crisisCode) {
//TODO:
// 1. set aidr_predict.crisis.isTrashed = false
// 2. set model_family.isActive = 1
logger.info("Received request to untrash collection from aidr_predict DB: " + crisisCode);
CollectionDTO crisis = null;
StringBuilder sb = new StringBuilder();
try {
crisis = remoteCrisisEJB.getCrisisByCode(crisisCode);
if (null == crisis) {
logger.warn("crisis does not exist in aidr_predict DB for: " + crisisCode);
return sb.append("{\"status\": \"UNTRASHED\"}").toString();
}
} catch (Exception e) {
logger.error("Could not retrieve crisis to untrash: " + crisisCode);
return sb.append("{\"status\": \"FAILED\"}").toString();
}
try {
if (crisis != null) {
crisis.setIsTrashed(false);
List<ModelFamilyDTO> associatedModels = remoteModelFamilyEJB.getAllModelFamiliesByCrisis(crisis.getCrisisID());
remoteCrisisEJB.merge(crisis.toEntity());
if (associatedModels != null) {
List<ModelFamily> list = new ArrayList<ModelFamily>();
for (ModelFamilyDTO model: associatedModels) {
model.setIsActive(true);
list.add(model.toEntity());
}
remoteModelFamilyEJB.merge(list);
logger.info("Found for " + crisisCode + ", model families = " + associatedModels.size());
}
}
logger.info("Untrashed crisis: " + crisisCode);
return sb.append("{\"status\": \"UNTRASHED\"}").toString();
} catch (Exception e) {
logger.error("Something went wrong in untrashing attempt!");
return sb.append("{\"status\": \"FAILED\"}").toString();
}
}
}