View Javadoc

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   * FQCN : com.atlassian.jira.workflow.condition.ActivityCondition
32   * @author Kaamelot
33   * @since
34   * Description : Evaluate if an activity exist on the Issue
35   * - On Issue  
36   * - On Transition  
37   * - On Comment
38   * - On Worklog  
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  		// Verify Edition Activity 
58  		delay = (String)delays.get(ON_EDIT);
59  		if (delay != null) {
60  			isIssueActive = isIssueActive(issue.getUpdated(), DateTools.getToday(), delay);
61  		}
62  
63  		// Verify Transition Activity 
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  		// Verify Comment Activity 
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  		// Verify Worklog Activity 
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 }