//----------------------------BEGIN LICENSE----------------------------
/*
* Willow : the Open Source WorkFlow Project
* Distributable under GNU LGPL license by gun.org
*
* Copyright (C) 2004-2010 huihoo.org
* Copyright (C) 2004-2010 ZosaTapo <dertyang@hotmail.com>
*
* ====================================================================
* Project Homepage : http://www.huihoo.org/willow
* Source Forge : http://sourceforge.net/projects/huihoo
* Mailing list : willow@lists.sourceforge.net
*/
//----------------------------END LICENSE-----------------------------
package org.huihoo.workflow.impl.store.util;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.huihoo.workflow.WorkflowException;
import org.huihoo.workflow.runtime.PerformerSelector;
import org.huihoo.workflow.runtime.WorkflowService;
import org.huihoo.workflow.runtime.WorkflowWork;
import org.huihoo.workflow.store.UserDatabase;
import org.huihoo.workflow.usermodel.WorkflowDepartment;
import org.huihoo.workflow.usermodel.WorkflowGroup;
import org.huihoo.workflow.usermodel.WorkflowParticipant;
import org.huihoo.workflow.usermodel.WorkflowRole;
import org.huihoo.workflow.xpdl.ExtendedAttribute;
import org.huihoo.workflow.xpdl.WorkflowActivity;
import org.huihoo.workflow.xpdl.WorkflowProcess;
import org.huihoo.workflow.xpdl.WorkflowTransition;
import org.huihoo.workflow.xpdl.XPDLGlobals;
import org.huihoo.workflow.xpdl.activity.PerformerType;
/**
* @author reic
*
* To change the template for this generated type comment go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
public class ParticipantSelector
{
/**
* ��ȡ��Ҫ��Ա�����Ļ�IJ������б�
*
* @param workflowWork �ȴ��ɷ��Ĺ�����
* @param workflowTransition ��������ɷ���ת·��
**/
public static List select(
WorkflowService workflowService,
WorkflowProcess workflowProcess,
WorkflowWork workflowWork,
WorkflowTransition workflowTransition)
throws WorkflowException
{
WorkflowActivity workflowActivity = workflowTransition.getToWorkflowActivity();
// if( ! ActivityType.ACTIVITY_BUSINESS.equals(workflowActivity.getActivityType()))
// {
// return null;
// }
PerformerType performerType = workflowActivity.getPerformerType();
UserDatabase userDatabase =workflowService.getUserDatabase();
List users =null;
if (PerformerType.PERFORMER_PARTICIPANT_BASED.equals(performerType))
{
users=ParticipantSelector.selectByParicipant(userDatabase,workflowActivity);
}
else if (PerformerType.PERFORMER_GROUP_BASED.equals(performerType))
{
users=ParticipantSelector.selectByGroup(userDatabase,workflowActivity);
}
else if (PerformerType.PERFORMER_ROLE_BASED.equals(performerType))
{
users=ParticipantSelector.selectByRole(userDatabase,workflowActivity);
}
else if (PerformerType.PERFORMER_DEPARTMENT_BASED.equals(performerType))
{
users=ParticipantSelector.selectByDepartment(userDatabase,workflowActivity);
}
else if (PerformerType.PERFORMER_CATEGORY_BASED.equals(performerType))
{
users=ParticipantSelector.selectByCategory(userDatabase,workflowActivity);
}
else if (PerformerType.PERFORMER_RANK_BASED.equals(performerType))
{
users=ParticipantSelector.selectByRank(userDatabase,workflowActivity);
}
else if (PerformerType.PERFORMER_SELECTOR_BASED.equals(performerType))
{
users=ParticipantSelector.selectBySelector(workflowWork,workflowTransition);
}
return users;
}
//------------------------------------------------------------------------------
// private function blocks
//------------------------------------------------------------------------------
private static List selectByParicipant(UserDatabase userDatabase,WorkflowActivity workflowActivity)
throws WorkflowException
{
List users = new ArrayList();
List userIds = workflowActivity.getPerformers();
int sizeUser = userIds.size();
for (int i = 0; i < sizeUser; ++i)
{
append2List(users, userDatabase.findParticipant((String) userIds.get(i)));
}
return users;
}
private static List selectByGroup(UserDatabase userDatabase,WorkflowActivity workflowActivity)
throws WorkflowException
{
List users = new ArrayList();
List groupIds = workflowActivity.getPerformers();
int sizeGroup = groupIds.size();
for (int i = 0; i < sizeGroup; ++i)
{
WorkflowGroup group = (WorkflowGroup) userDatabase.findGroup((String) groupIds.get(i));
Iterator userInterator = group.getParticipants();
while (userInterator.hasNext())
{
WorkflowParticipant user = (WorkflowParticipant) userInterator.next();
append2List(users, user);
}
}
return users;
}
private static List selectByRole(UserDatabase userDatabase,WorkflowActivity workflowActivity)
throws WorkflowException
{
List users = new ArrayList();
List roleIds = workflowActivity.getPerformers();
int sizeRole = roleIds.size();
for (int i = 0; i < sizeRole; ++i)
{
WorkflowRole role = (WorkflowRole) userDatabase.findRole((String) roleIds.get(i));
Iterator userInterator = role.getParticipants();
while (userInterator.hasNext())
{
WorkflowParticipant user = (WorkflowParticipant) userInterator.next();
append2List(users, user);
}
}
return users;
}
private static List selectByDepartment(UserDatabase userDatabase,WorkflowActivity workflowActivity)
throws WorkflowException
{
List users = new ArrayList();
List deptIds = workflowActivity.getPerformers();
int sizeDept = deptIds.size();
for (int i = 0; i < sizeDept; ++i)
{
WorkflowDepartment dept = (WorkflowDepartment) userDatabase.findDepartment((String) deptIds.get(i));
Iterator userInterator = dept.getParticipants();
while (userInterator.hasNext())
{
WorkflowParticipant user = (WorkflowParticipant) userInterator.next();
append2List(users, user);
}
}
return users;
}
private static List selectByCategory(UserDatabase userDatabase,WorkflowActivity workflowActivity)
throws WorkflowException
{
List users = new ArrayList();
List catIds = workflowActivity.getPerformers();
int sizeCat = catIds.size();
for (int i = 0; i < sizeCat; ++i)
{
String catId = (String) catIds.get(i);
Iterator depts = userDatabase.getDepartments();
while (depts.hasNext())
{
WorkflowDepartment dept = (WorkflowDepartment) userDatabase.findDepartment((String) depts.next());
if (dept.getCategory() != null && catId.equals(dept.getCategory().getUUID()))
{
Iterator userInterator = dept.getParticipants();
while (userInterator.hasNext())
{
WorkflowParticipant user = (WorkflowParticipant) userInterator.next();
append2List(users, user);
}
}
}
}
return users;
}
private static List selectByRank(UserDatabase userDatabase,WorkflowActivity workflowActivity)
throws WorkflowException
{
List users = new ArrayList();
List rankIds = workflowActivity.getPerformers();
int sizeRank = rankIds.size();
for (int i = 0; i < sizeRank; ++i)
{
String rankId = (String) rankIds.get(i);
Iterator userInterator = userDatabase.getParticipants();
while (userInterator.hasNext())
{
WorkflowParticipant user = (WorkflowParticipant) userInterator.next();
if (user.getRank() != null && rankId.equals(user.getRank().getUUID()))
{
append2List(users, user);
}
}
}
return users;
}
private static List selectBySelector(
WorkflowWork workflowWork,
WorkflowTransition workflowTransition)
throws WorkflowException
{
List users = new ArrayList();
WorkflowActivity workflowActivity = workflowTransition.getToWorkflowActivity();
ExtendedAttribute attribute =
(ExtendedAttribute) workflowActivity.getExtendedAttributes().get(
XPDLGlobals.SELECTOR_QUALIFIED_CLASS_NAME);
String implClassName = attribute.getValue();
Class implClass = null;
PerformerSelector selector = null;
try
{
implClass = Class.forName(implClassName);
selector = (PerformerSelector) implClass.newInstance();
}
catch (Exception e)
{
throw new WorkflowException(e);
}
users = selector.select(workflowWork, workflowTransition);
return users;
}
private static void append2List(List users, WorkflowParticipant user)
{
int sizeUsers = users.size();
boolean found = false;
WorkflowParticipant temp = null;
for (int i = 0; i < sizeUsers; ++i)
{
temp = (WorkflowParticipant) users.get(i);
if (user.getUUID().equals(temp.getUUID()))
{
found = true;
break;
}
}
if (!found)
{
users.add(user);
}
}
}