/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
package org.dspace.xmlworkflow.storedcomponents;
import org.dspace.authorize.AuthorizeException;
import org.dspace.core.Context;
import org.dspace.eperson.EPerson;
import org.dspace.eperson.Group;
import org.dspace.storage.rdbms.DatabaseManager;
import org.dspace.storage.rdbms.TableRow;
import org.dspace.storage.rdbms.TableRowIterator;
import org.dspace.xmlworkflow.WorkflowRequirementsManager;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* Pool task representing the database representation of a pool task for a step and an eperson
*
* @author Bram De Schouwer (bram.deschouwer at dot com)
* @author Kevin Van de Velde (kevin at atmire dot com)
* @author Ben Bosman (ben at atmire dot com)
* @author Mark Diggory (markd at atmire dot com)
*/
public class PoolTask {
/** Our context */
private Context myContext;
/** The row in the table representing this object */
private TableRow myRow;
/**
* Construct an PoolTask
*
* @param context
* the context this object exists in
* @param row
* the corresponding row in the table
*/
PoolTask(Context context, TableRow row)
{
myContext = context;
myRow = row;
}
public static PoolTask find(Context context, int id)
throws SQLException {
TableRow row = DatabaseManager.find(context, "cwf_pooltask", id);
if (row == null)
{
return null;
}
else
{
return new PoolTask(context, row);
}
}
public static List<PoolTask> findByEperson(Context context, int eperson_id) throws SQLException, AuthorizeException, IOException {
TableRowIterator tri = DatabaseManager.queryTable(context,"cwf_pooltask",
"SELECT * FROM cwf_pooltask WHERE eperson_id= "+eperson_id);
//Hashmap to map workflow item id's to pooltasks. This will allow to have a list of unique workflowitems for which
//the user will see PoolTasks
HashMap<Integer, PoolTask> tasks = new HashMap<Integer, PoolTask>();
//Get all PoolTasks for a specific eperson
while(tri.hasNext()){
TableRow row = tri.next();
PoolTask task = new PoolTask(context, row);
tasks.put(task.getWorkflowItemID(), task);
}
tri.close();
//Get all PoolTasks for groups of which this eperson is a member
for(Group group: Group.allMemberGroups(context, EPerson.find(context, eperson_id))){
tri = DatabaseManager.queryTable(context,"cwf_pooltask",
"SELECT * FROM cwf_pooltask WHERE group_id= "+group.getID());
while(tri.hasNext()){
TableRow row = tri.next();
PoolTask task = new PoolTask(context, row);
XmlWorkflowItem wfi = XmlWorkflowItem.find(context, task.getWorkflowItemID());
//If the user has not claimed and not finished the step, return a pooltask for the user
if(!(InProgressUser.findByWorkflowItemAndEPerson(context, wfi.getID(), eperson_id)!=null)){
tasks.put(task.getWorkflowItemID(), task);
}
}
tri.close();
}
return new ArrayList(tasks.values());
}
public static List<PoolTask> find(Context context, XmlWorkflowItem workflowItem) throws SQLException {
TableRowIterator tri = DatabaseManager.queryTable(context,"cwf_pooltask",
"SELECT * FROM cwf_pooltask WHERE workflowitem_id= "+workflowItem.getID());
List<PoolTask> list = new ArrayList<PoolTask>();
while(tri.hasNext()){
TableRow row = tri.next();
list.add(new PoolTask(context, row));
}
tri.close();
return list;
}
public static PoolTask findByWorkflowIdAndEPerson(Context context, int workflowID, int epersonID) throws SQLException, AuthorizeException, IOException {
TableRow row = DatabaseManager.querySingleTable(context,"cwf_pooltask",
"SELECT * FROM cwf_pooltask WHERE workflowitem_id= ? AND eperson_id = ?", workflowID, epersonID);
//If there is a pooltask for this eperson, return it
if(row != null)
return new PoolTask(context, row);
else{
//If the user has a is processing or has finished the step for a workflowitem, there is no need to look for pooltasks for one of his
//groups because the user already has the task claimed
XmlWorkflowItem wfi = XmlWorkflowItem.find(context, workflowID);
if(InProgressUser.findByWorkflowItemAndEPerson(context, workflowID, epersonID)!=null){
return null;
}
else{
//If the user does not have a claimedtask yet, see whether one of the groups of the user has pooltasks
//for this workflow item
for(Group group: Group.allMemberGroups(context, EPerson.find(context, epersonID))){
row = DatabaseManager.querySingleTable(context,"cwf_pooltask",
"SELECT * FROM cwf_pooltask WHERE workflowitem_id= ? AND group_id = ?", workflowID, group.getID());
if(row != null){
return new PoolTask(context, row);
}
}
}
}
return null;
}
public static PoolTask create(Context context) throws SQLException {
TableRow row = DatabaseManager.create(context, "cwf_pooltask");
return new PoolTask(context, row);
}
public void delete() throws SQLException
{
DatabaseManager.delete(myContext, myRow);
}
public void update() throws SQLException
{
DatabaseManager.update(myContext, myRow);
}
public void setEpersonID(int id){
myRow.setColumn("eperson_id", id);
}
public int getEpersonID(){
return myRow.getIntColumn("eperson_id");
}
public void setGroupID(int id){
myRow.setColumn("group_id", id);
}
public int getGroupID(){
return myRow.getIntColumn("group_id");
}
public void setWorkflowID(String id){
myRow.setColumn("workflow_id", id);
}
public String getWorkflowID(){
return myRow.getStringColumn("workflow_id");
}
public void setWorkflowItemID(int id){
myRow.setColumn("workflowitem_id", id);
}
public int getWorkflowItemID(){
return myRow.getIntColumn("workflowitem_id");
}
public void setStepID(String stepID){
myRow.setColumn("step_id", stepID);
}
public String getStepID() throws SQLException {
return myRow.getStringColumn("step_id");
}
public void setActionID(String actionID){
myRow.setColumn("action_id", actionID);
}
public String getActionID(){
return myRow.getStringColumn("action_id");
}
}