1 package com.atlassian.jira.workflow.condition;
2
3 import java.util.Arrays;
4 import java.util.Date;
5 import java.util.HashMap;
6 import java.util.Iterator;
7 import java.util.List;
8 import java.util.Map;
9
10 import org.ofbiz.core.entity.GenericEntityException;
11 import org.ofbiz.core.entity.GenericValue;
12
13 import com.atlassian.core.util.DateUtils;
14 import com.atlassian.core.util.InvalidDurationException;
15 import com.atlassian.jira.ComponentManager;
16 import com.atlassian.jira.ManagerFactory;
17 import com.atlassian.jira.issue.MutableIssue;
18 import com.atlassian.jira.issue.comments.Comment;
19 import com.atlassian.jira.issue.comments.CommentManager;
20 import com.atlassian.jira.issue.worklog.Worklog;
21 import com.atlassian.jira.issue.worklog.WorklogManager;
22 import com.atlassian.jira.util.DateTools;
23 import com.atlassian.jira.workflow.transition.TransitionManager;
24 import com.atlassian.jira.workflow.transition.step.Step;
25 import com.opensymphony.module.propertyset.PropertySet;
26 import com.opensymphony.workflow.WorkflowException;
27 import com.opensymphony.workflow.spi.WorkflowEntry;
28
29
30
31
32
33
34
35
36
37
38
39
40 public class ActivityCondition extends AbstractJiraCondition {
41
42 public String ON_WORKGLOG = "onWorklog";
43 public String ON_TRANSITION = "onTransition";
44 public String ON_COMMENT = "onComment";
45 public String ON_EDIT = "onEdit";
46
47 protected static TransitionManager transitionManager = (TransitionManager)ComponentManager.getComponentInstanceOfType(TransitionManager.class);
48 protected static CommentManager commentManager = (CommentManager)ComponentManager.getComponentInstanceOfType(CommentManager.class);
49 protected static WorklogManager worklogManager = (WorklogManager)ComponentManager.getComponentInstanceOfType(WorklogManager.class);
50
51 public boolean passesCondition(Map _transientVars, Map _args, PropertySet _ps) throws WorkflowException {
52 MutableIssue issue = (MutableIssue) _transientVars.get("issue");
53 boolean isIssueActive = false;
54 Map delays = getDelays(_args);
55 String delay = null;
56
57
58 delay = (String)delays.get(ON_EDIT);
59 if (delay != null) {
60 isIssueActive = isIssueActive(issue.getUpdated(), DateTools.getToday(), delay);
61 }
62
63
64 delay = (String)delays.get(ON_TRANSITION);
65 if (!isIssueActive && delay != null) {
66 List transitions = getTransitions(_transientVars);
67 if (!transitions.isEmpty()) {
68 Step step = (Step)transitions.get(transitions.size()-1);
69 isIssueActive = isIssueActive(step.getFinishDate(), DateTools.getToday(), delay);
70 }
71 }
72
73
74 delay = (String)delays.get(ON_COMMENT);
75 if (!isIssueActive && delay != null) {
76 List comments = commentManager.getComments(issue);
77 if (!comments.isEmpty()) {
78 Comment comment = (Comment)comments.get(comments.size()-1);
79 isIssueActive = isIssueActive(comment.getUpdated(), DateTools.getToday(), delay);
80 }
81 }
82
83
84 delay = (String)delays.get(ON_WORKGLOG);
85 if (!isIssueActive && delay != null) {
86 List worklogs = worklogManager.getByIssue(issue);
87 if (!worklogs.isEmpty()) {
88 Worklog worklog = (Worklog)worklogs.get(worklogs.size()-1);
89 isIssueActive = isIssueActive(worklog.getUpdated(), DateTools.getToday(), delay);
90 }
91 }
92
93 return isIssueActive;
94 }
95
96 public boolean isIssueActive(Date _date1, Date _date2, String _delay) {
97 try {
98 return (_date2.getTime() - _date1.getTime()) <= DateUtils.getDuration(_delay) ;
99 } catch (InvalidDurationException e) {
100 e.printStackTrace();
101 return true;
102 }
103 }
104
105 public List getTransitions(Map _transientVars) {
106 List transitions = null;
107 WorkflowEntry entry = (WorkflowEntry) _transientVars.get("entry");
108 if (entry == null) {
109 GenericValue gvIssue = null;
110 try {
111 gvIssue = ManagerFactory.getIssueManager().getIssueByWorkflow(new Long(entry.getId()));
112 transitions = transitionManager.getTransitions(gvIssue);
113 } catch (GenericEntityException e) {
114 e.printStackTrace();
115 }
116 } else {
117 transitions = transitionManager.getTransitions(new Long(entry.getId()));
118 }
119 return transitions;
120 }
121
122 public Map getMap(Map _map, List _keys) {
123 Map result = new HashMap();
124 for (Iterator iterator = _keys.iterator(); iterator.hasNext();) {
125 Object key = iterator.next();
126 Object value = _map.get(key);
127 if (value!=null) {
128 result.put(key, value);
129 }
130 }
131 return result;
132 }
133
134 public Map getDelays(Map _args) {
135 return getMap(_args,Arrays.asList(new String[]{ON_WORKGLOG, ON_TRANSITION, ON_COMMENT, ON_EDIT}));
136 }
137 }