/**
* Implements operations for managing the task_assignment table of the aidr_predict DB
*/
package qa.qcri.aidr.dbmanager.ejb.remote.facade.imp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.ejb.Stateless;
import org.apache.log4j.Logger;
import org.hibernate.criterion.Restrictions;
import qa.qcri.aidr.dbmanager.dto.DocumentDTO;
import qa.qcri.aidr.dbmanager.dto.TaskAssignmentDTO;
import qa.qcri.aidr.dbmanager.ejb.local.facade.impl.CoreDBServiceFacadeImp;
import qa.qcri.aidr.dbmanager.ejb.remote.facade.TaskAssignmentResourceFacade;
import qa.qcri.aidr.dbmanager.entities.task.TaskAssignment;
@Stateless(name="TaskAssignmentResourceFacadeImp")
public class TaskAssignmentResourceFacadeImp extends CoreDBServiceFacadeImp<TaskAssignment, Long> implements TaskAssignmentResourceFacade {
private Logger logger = Logger.getLogger("db-manager-log");
public TaskAssignmentResourceFacadeImp() {
super(TaskAssignment.class);
}
@Override
public int insertTaskAssignment(List<DocumentDTO> taskList, Long userID) {
logger.debug("[insertTaskAssignment] Going to insert/create task list of size = " + taskList.size() + ", for userID: " + userID);
try {
for (DocumentDTO documentDTO : taskList) {
/*List<TaskAssignment> taskAssignments = getAllByCriteria(Restrictions.eq("id.documentId", documentDTO.getDocumentID()));
if(null == taskAssignments || taskAssignments.size()== 0){*/
// No assigned tasks currently for user
TaskAssignment taskAssignment = new TaskAssignment(documentDTO.getDocumentID(), userID, new Date());
save(taskAssignment);
em.flush();
// }
}
return 1;
} catch (Exception e) {
logger.error("Error in insert operation!", e);
return 0;
}
}
@Override
public int insertOneTaskAssignment(Long documentID, Long userID) {
try {
List<TaskAssignment> taskAssignments = getAllByCriteria(Restrictions.eq("id.documentId", documentID));
if(null == taskAssignments || taskAssignments.size()== 0){
TaskAssignment taskAssignment = new TaskAssignment(documentID, userID, new Date());
save(taskAssignment);
em.flush();
return 1;
}
} catch (Exception e) {
logger.error("Error in insert operation!", e);
}
return 0;
}
@Override
public int undoTaskAssignment(List<DocumentDTO> taskList, Long userID) {
if (taskList != null && !taskList.isEmpty()) {
try {
int deleteCount = 0;
for (Iterator<DocumentDTO> it = taskList.iterator(); it.hasNext();){
DocumentDTO tb = (DocumentDTO) it.next();
TaskAssignment taskAssignment = (TaskAssignment) getTaskAssignment(tb.getDocumentID(), userID);
delete(taskAssignment);
em.flush();
++deleteCount;
}
return deleteCount;
} catch (Exception e) {
logger.error("Error in undo operation!");
}
}
return 0;
}
@Override
public int undoTaskAssignment(Map<Long, Long> taskMap) {
if (taskMap != null) {
try {
int deleteCount = 0;
Iterator entries = taskMap.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
Long key = (Long)entry.getKey();
Long value = (Long)entry.getValue();
TaskAssignment taskAssignment = (TaskAssignment) getTaskAssignment(key, value);
delete(taskAssignment);
em.flush();
++deleteCount;
}
return deleteCount;
} catch (Exception e) {
logger.error("Error in undo operation!");
}
}
return 0;
}
@Override
public int undoTaskAssignment(Long documentID, Long userID) {
try {
TaskAssignment taskAssignment = (TaskAssignment) getTaskAssignment(documentID, userID);
if(taskAssignment!=null){
delete(taskAssignment);
em.flush();
return 1;
}
} catch (Exception e) {
logger.error("Error in undo operation!");
}
return 0;
}
@Override
public void undoTaskAssignmentByTimer() {
try {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.HOUR, -12);
String calDate = dateFormat.format(cal.getTime());
List<TaskAssignment> taskAssignments = getAllByCriteria(Restrictions.le("assignedAt",dateFormat.parse(calDate)));
if (taskAssignments != null) {
for (Iterator it =taskAssignments.iterator(); it.hasNext();){
TaskAssignment taskAssignment = (TaskAssignment) it.next();
undoTaskAssignment(taskAssignment.getId().getDocumentId(), taskAssignment.getId().getUserId());
}
}
} catch (Exception e) {
logger.error("Error in undoTaskAssignmentByTimer.");
}
}
private TaskAssignment getTaskAssignment(Long documentID, Long userID) {
Map<String, Long> attMap = new HashMap<String, Long>();
attMap.put("id.documentId", documentID);
attMap.put("id.userId", userID);
try {
TaskAssignment t = getByCriteria(Restrictions.allEq(attMap));
return t;
} catch (Exception e) {
logger.error("Error in find operation: documentID = " + documentID + ", userID = " + userID);
return null;
}
}
@Override
public TaskAssignmentDTO findTaskAssignment(Long documentID, Long userID) {
Map<String, Long> attMap = new HashMap<String, Long>();
attMap.put("id.documentId", documentID);
attMap.put("id.userId", userID);
try {
TaskAssignment t = getByCriteria(Restrictions.allEq(attMap));
return t != null ? new TaskAssignmentDTO(t) : null;
} catch (Exception e) {
logger.error("Error in find operation: documentID = " + documentID + ", userID = " + userID);
return null;
}
}
@Override
public List<TaskAssignmentDTO> findTaskAssignmentByID(Long documentID) {
try {
List<TaskAssignment> list = getAllByCriteria(Restrictions.eq("id.documentId", documentID));
List<TaskAssignmentDTO> dtoList = new ArrayList<TaskAssignmentDTO>();
if (list != null && !list.isEmpty()) {
for (TaskAssignment t: list) {
dtoList.add(new TaskAssignmentDTO(t));
}
}
return dtoList;
} catch (Exception e) {
logger.error("Error in find operation: documentID = " + documentID, e);
return null;
}
}
@Override
public Integer getPendingTaskCount(Long userID) {
try {
List<TaskAssignment> taskAssignments = getAllByCriteria(Restrictions.eq("id.userId",userID));
logger.info("pending for userID " + userID + "tasks = " + (taskAssignments != null ? taskAssignments.size() : "null"));
return (taskAssignments != null ? taskAssignments.size() : 0);
} catch (Exception e) {
logger.error("Error in find operation: userID = " + userID);
}
return -1;
}
}