/**
* Interface for the task manager that covers the following tables: document, document_nominal_label, task_assignment and task_answer
* of the aidr_predict table.
*/
package qa.qcri.aidr.dbmanager.ejb.remote.facade;
import java.util.List;
import java.util.Map;
import javax.ejb.Remote;
import org.apache.log4j.Logger;
import org.hibernate.criterion.Criterion;
import qa.qcri.aidr.dbmanager.dto.DocumentDTO;
import qa.qcri.aidr.dbmanager.dto.DocumentNominalLabelDTO;
import qa.qcri.aidr.dbmanager.dto.HumanLabeledDocumentDTO;
import qa.qcri.aidr.dbmanager.dto.TaskAnswerDTO;
import qa.qcri.aidr.dbmanager.dto.TaskAssignmentDTO;
import qa.qcri.aidr.dbmanager.dto.UsersDTO;
import com.fasterxml.jackson.core.type.TypeReference;
@Remote
public interface TaskManagerRemote<T, Serializable> {
static Logger logger = Logger.getLogger(TaskManagerRemote.class);
public Class<T> getClassType();
//public String getAllTasks();
public List<DocumentDTO> getAllTasks();
public long insertNewTask(T task);
public void insertNewTask(List<T> collection);
public Long saveNewTask(T task, Long crisisID);
public List<Long> saveNewTasks(List<T> collection, Long crisisID);
public void assignNewTaskToUser(Long id, Long userId) throws Exception;
public void assignNewTaskToUser(List<DocumentDTO> collection, Long userId) throws Exception;
public void undoTaskAssignment(Map<Long, Long> taskMap) throws Exception;
public void undoTaskAssignment(Long documentID, Long userID) throws Exception;
public int deleteTaskById(Long id);
public int deleteTask(T task);
public int deleteTask(List<T> collection);
public int deleteUnassignedTaskCollection(List<T> collection);
public int deleteUnassignedTask(T task);
public int deleteStaleTasks(String joinType, String joinTable, String joinColumn,
String sortOrder, String[] orderBy,
final String maxTaskAge, final String scanInterval);
public int truncateLabelingTaskBufferForCrisis(final long crisisID, final int maxLength, final int ERROR_MARGIN);
public void updateTask(T task);
public void updateTaskList(List<T> collection);
public void updateTask(DocumentDTO dto);
public void taskUpdate(Criterion criterion, String joinType, String joinTable,
String joinColumn, String sortOrder, String[] orderBy);
public DocumentDTO getNewTask(Long crisisID);
public DocumentDTO getNewTask(Long crisisID, Criterion criterion);
public List<DocumentDTO> getNewTaskCollection(Long crisisID, Integer count, String order, Criterion criterion);
public Integer getPendingTaskCountByUser(Long userId);
public DocumentDTO getTaskById(Long id);
public List<TaskAssignmentDTO> getAssignedTasksById(Long id);
public TaskAssignmentDTO getAssignedTaskByUserId(Long id, Long userId);
public DocumentDTO getDocumentById(Long id);
public UsersDTO getUserByName(String name);
public UsersDTO getUserById(Long id);
public List<UsersDTO> getAllUserByName(String name);
public void insertTaskAnswer(TaskAnswerDTO taskAnswer);
public void saveDocumentNominalLabel(DocumentNominalLabelDTO documentNominalLabel);
public boolean foundDuplicateDocumentNominalLabel(DocumentNominalLabelDTO documentNominalLabel);
public List<DocumentDTO> getNominalLabelDocumentCollection(Long nominalLabelID);
public DocumentDTO getTaskByCriterion(Long crisisID, Criterion criterion);
public List<DocumentDTO> getTaskCollectionByCriterion(Long crisisID, Integer count, Criterion criterion);
//public qa.qcri.aidr.task.entities.Document getNewDocumentByCriterion(Long id, Criterion criterion);
//public qa.qcri.aidr.task.entities.Document getNewDocumentByCrisisId(Long crisisID);
public <E> Object setTaskParameter(Class<E> entityType, Long id, Map<String, String> paramMap);
public <E> Boolean isTaskAssigned(E task);
public <E> Boolean isTaskNew(E task);
public <E> Boolean isTaskDone(E task);
public <E> Boolean isExists(E task);
public <E> E deSerialize(String jsonString, Class<E> entityType);
public <E> E deSerializeList(String jsonString, TypeReference<E> type);
public <E> String serializeTask(E task);
public List<HumanLabeledDocumentDTO> getHumanLabeledDocumentsByCrisisID(Long crisisID, Integer count) throws Exception;
public List<HumanLabeledDocumentDTO> getHumanLabeledDocumentsByCrisisCode(String crisisCode, Integer count) throws Exception;
public List<HumanLabeledDocumentDTO> getHumanLabeledDocumentsByCrisisIDUserID(Long crisisID, Long userID, Integer count) throws Exception;
public List<HumanLabeledDocumentDTO> getHumanLabeledDocumentsByCrisisIDUserName(Long crisisID, String userName, Integer count) throws Exception;
public List<DocumentDTO> getDocumentsForTagging(final Long crisisID, final int count, final String userName, final int remainingCount);
// for testing purpose
public String pingRemoteEJB();
public boolean deleteTask(Long crisisID, Long userID);
public void importTrainingDataForClassifier(Long targetCollectionId, Long sourceCollectionId, Long nominalAttributeId);
}