package pl.net.bluesoft.rnd.processtool.ui.activity;
import static org.aperteworkflow.util.vaadin.VaadinExceptionHandler.Util.withErrorHandling;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Set;
import pl.net.bluesoft.rnd.processtool.ProcessToolContext;
import pl.net.bluesoft.rnd.processtool.model.BpmTask;
import pl.net.bluesoft.rnd.processtool.model.ProcessInstance;
import pl.net.bluesoft.rnd.processtool.model.ProcessInstanceFilter;
import pl.net.bluesoft.rnd.processtool.model.QueueType;
import pl.net.bluesoft.rnd.processtool.model.processdata.ProcessDeadline;
import pl.net.bluesoft.rnd.processtool.ui.tasks.TaskTableItem;
import pl.net.bluesoft.rnd.processtool.ui.widgets.taskitem.TaskItemProviderBase;
import pl.net.bluesoft.rnd.processtool.ui.widgets.taskitem.TaskItemProviderParams;
import com.vaadin.ui.Component;
/**
* @author tlipski@bluesoft.net.pl
*/
public class MyProcessesListPane extends ProcessListPane {
public MyProcessesListPane(ActivityMainPane activityMainPane, String title) {
super(activityMainPane, title);
}
public MyProcessesListPane(ActivityMainPane activityMainPane, ProcessInstanceFilter filter) {
super(activityMainPane, filter.getName(), filter);
}
@Override
protected ProcessInstanceFilter getDefaultFilter() {
ProcessInstanceFilter processFilter = new ProcessInstanceFilter();
ProcessToolContext ctx = ProcessToolContext.Util.getThreadProcessToolContext();
processFilter.setName(getMessage("activity.assigned.tasks"));
processFilter.addOwner(getBpmSession().getUser(ctx));
processFilter.setFilterOwner(getBpmSession().getUser(ctx));
processFilter.addQueueType(QueueType.ASSIGNED_TO_CURRENT_USER);
return processFilter;
}
@Override
protected Component getTaskItem(final TaskTableItem tti) {
ProcessToolContext ctx = ProcessToolContext.Util.getThreadProcessToolContext();
ProcessInstance pi = tti.getTask().getProcessInstance();
TaskItemProviderBase tip = getTaskItemProvider(ctx, pi);
TaskItemProviderParams params = getTaskItemProviderParams(ctx, tti);
return tip.getTaskPane(params);
}
@Override
protected void onClick(final TaskItemProviderParams params) {
withErrorHandling(getApplication(), new Runnable() {
@Override
public void run() {
displayProcessData(params.getTask());
}
});
}
@Override
protected void sortTaskItems(List<TaskTableItem> taskItems) {
final Date now = new Date();
ProcessToolContext ctx = ProcessToolContext.Util.getThreadProcessToolContext();
List<TaskTableItem> outdatedItems = new ArrayList<TaskTableItem>();
List<TaskTableItem> recentItems = new ArrayList<TaskTableItem>();
List<TaskTableItem> finishedItems = new ArrayList<TaskTableItem>();
for (TaskTableItem tti : taskItems) {
BpmTask task = tti.getTask();
if (getBpmSession().isProcessRunning(task.getProcessInstance().getInternalId(), ctx)) {
if (isOutdated(now, getDeadlineDate(task))) {
outdatedItems.add(tti);
}
else {
recentItems.add(tti);
}
}
else {
finishedItems.add(tti);
}
}
taskItems.clear();
for (List<TaskTableItem> list : new List[] {outdatedItems, recentItems, finishedItems}) {
Collections.sort(list, new Comparator<TaskTableItem>() {
@Override
public int compare(TaskTableItem o1, TaskTableItem o2) {
return o2.getTask().getCreateDate().compareTo(o1.getTask().getCreateDate());
}
});
taskItems.addAll(list);
}
}
public static boolean isOutdated(Date baseDate, Date checkedDate) {
return checkedDate != null && checkedDate.before(baseDate);
}
protected void displayProcessData(BpmTask task) {
activityMainPane.displayProcessData(task);
}
/** Metoda wylicza date wygasniecia procesu. W przypadku podprocesow, siega
* do atrubutow procesu głównego
*/
public static Date getDeadlineDate(BpmTask task)
{
ProcessInstance process = task.getProcessInstance();
Set<ProcessDeadline> deadlines = process.findAttributesByClass(ProcessDeadline.class);
for (ProcessDeadline pd : deadlines) {
if (pd.getTaskName().equalsIgnoreCase(task.getTaskName())) {
return pd.getDueDate();
}
}
return null;
}
@Override
protected boolean getDataPaneUsesSpacing() {
return false;
}
public void setType(QueueType type)
{
// TODO Auto-generated method stub
}
}