package qa.qcri.aidr.trainer.api.service.impl; //import org.apache.log4j.Logger; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import qa.qcri.aidr.dbmanager.dto.CollectionDTO; import qa.qcri.aidr.dbmanager.dto.DocumentDTO; import qa.qcri.aidr.dbmanager.ejb.remote.facade.TaskManagerRemote; import qa.qcri.aidr.dbmanager.entities.misc.Users; import qa.qcri.aidr.dbmanager.entities.task.Document; import qa.qcri.aidr.trainer.api.service.CrisisService; import qa.qcri.aidr.trainer.api.service.DocumentService; import qa.qcri.aidr.trainer.api.service.TaskAssignmentService; import qa.qcri.aidr.trainer.api.service.UsersService; import qa.qcri.aidr.trainer.api.store.CodeLookUp; import qa.qcri.aidr.trainer.api.template.CrisisJsonModel; import qa.qcri.aidr.trainer.api.template.CrisisJsonOutput; import qa.qcri.aidr.trainer.api.template.NominalAttributeJsonModel; import qa.qcri.aidr.trainer.api.template.TaskBufferJsonModel; //import qa.qcri.aidr.trainer.api.entity.Document; /** * Created with IntelliJ IDEA. * User: jilucas * Date: 10/1/13 * Time: 12:49 PM * To change this template use File | Settings | File Templates. */ @Service("documentService") @Transactional(readOnly = true) public class DocumentServiceImpl implements DocumentService { protected static Logger logger = Logger.getLogger(DocumentServiceImpl.class); //@Autowired //private DocumentDao documentDao; @Autowired private TaskAssignmentService taskAssignmentService; @Autowired private UsersService usersService; @Autowired private CrisisService crisisService; @Autowired TaskManagerRemote<DocumentDTO, Long> taskManager; @Override @Transactional(readOnly = false, propagation = Propagation.REQUIRED) public void updateHasHumanLabel(Long documentID, boolean value) { Map<String, String> paramMap = new HashMap<String, String>(); paramMap.put("setHasHumanLabels", new Boolean(value).toString()); //logger.info("Will use the merge attempt"); try { DocumentDTO dto = (DocumentDTO) taskManager.setTaskParameter(Document.class, documentID, paramMap); //logger.info("Update of hasHumanLabels successful for document " + dto.getDocumentID() + ", crisisId = " + dto.getCrisisDTO().getCrisisID()); } catch (Exception e) { logger.error("Update unsuccessful for documentID = " + documentID, e); } } @Override public DocumentDTO findDocument(Long documentID) { //return documentDao.findDocument(documentID); //To change body of implemented methods use File | Settings | File Templates. DocumentDTO doc = taskManager.getTaskById(documentID); return (doc != null) ? doc : null; } @Override @Transactional(readOnly = false, propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT) public List<DocumentDTO> getDocumentForTask(Long crisisID, int count, String userName) { if(count>CodeLookUp.DOCUMENT_MAX_FETCH_COUNT){ count = CodeLookUp.DOCUMENT_MAX_FETCH_COUNT; } List<DocumentDTO> documents = taskManager.getDocumentsForTagging(crisisID, count, userName, CodeLookUp.DOCUMENT_REMAINING_COUNT); logger.info("For crisisID = " + crisisID + ", user = " + userName + ", documents available for tagging: " + (documents != null ? documents.size() : "empty list")); return documents; } @Override @Transactional(readOnly = false, propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT) public List<DocumentDTO> getDocumentForOneTask(Long crisisID, int count, String userName) { //logger.info("getDocumentForOneTask is called"); /* List<DocumentDTO> documents = null; Users users = usersService.findUserByName(userName); if(users != null){ documents = this.getAvailableDocument(crisisID, count) ; System.out.println("For crisisID = " + crisisID + ", user = " + userName + ", documents available: " + (documents != null ? documents.size() : "empty list")); if(documents != null && documents.size() > 0){ taskAssignmentService.addToTaskAssignment(documents, users.getUserID()); System.out.println("Added to task_assignment table: " + documents.size() + "docID = " + documents.get(0).getDocumentID()); } } */ List<DocumentDTO> documents = taskManager.getDocumentsForTagging(crisisID, count, userName, 0); logger.info("For crisisID = " + crisisID + ", user = " + userName + ", documents available for tagging: " + (documents != null ? documents.size() : "empty list")); return documents; //To change body of implemented methods use File | Settings | File Templates. } @Override public List<TaskBufferJsonModel> findOneDocumentForTaskByCririsID(DocumentDTO document, Long crisisID) { List<TaskBufferJsonModel> jsonModelList = new ArrayList<TaskBufferJsonModel>(); if(document != null){ jsonModelList = getJsonModeForTask(crisisID, document); } return jsonModelList; } @Override @Transactional(readOnly = false, propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT) public void addToOneTaskAssignment(Long documentID, Long userID){ // addToOneTaskAssignment(documentID, userID); taskAssignmentService.addToOneTaskAssignment(documentID, userID); } @Override @Transactional(readOnly = false, propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT) public void addToOneTaskAssignmentWithUserName(Long documentID, String userName){ Users users = usersService.findUserByName(userName); taskAssignmentService.addToOneTaskAssignment(documentID, users.getId()); } private List<TaskBufferJsonModel> getJsonModeForTask(long crisisID, DocumentDTO document){ List<TaskBufferJsonModel> jsonModelList = new ArrayList<TaskBufferJsonModel>(); CollectionDTO crisis = crisisService.findByCrisisID(crisisID) ; CrisisJsonModel jsonOutput = new CrisisJsonOutput().crisisJsonModelGenerator(crisis); Set<NominalAttributeJsonModel> attributeJsonModelSet = jsonOutput.getNominalAttributeJsonModelSet() ; TaskBufferJsonModel jsonModel = new TaskBufferJsonModel(document.getDocumentID(),document.getCrisisDTO().getCrisisID(),attributeJsonModelSet,document.getLanguage(), document.getDoctype(), document.getData(), document.getValueAsTrainingSample(),0); jsonModelList.add(jsonModel); return jsonModelList; } @Override @Transactional(readOnly = true) public List<DocumentDTO> getAvailableDocument(Long crisisID, Integer maxresult){ //return documentDao.findDocumentForTask(crisisID, maxresult); List<DocumentDTO> dtoList = taskManager.getNewTaskCollection(crisisID, maxresult, "DESC", null); logger.info("Fetched from DB manager, documents list size = " + dtoList.size()); return dtoList; } private int getAvailableDocumentCount(Long crisisID){ //return documentDao.getAvailableTaskDocumentCount(crisisID); List<DocumentDTO> docList = getAvailableDocument(crisisID, null); return (docList != null) ? docList.size() : 0; } @Override public void importTrainingData(Long targetCollectionId, Long sourceCollectionId, Long attributeId) { try { taskManager.importTrainingDataForClassifier(targetCollectionId, sourceCollectionId, attributeId); } catch(Exception e) { logger.error("Error in importing data for attribute : " + attributeId, e); } } }