1 package com.atlassian.jira.service;
2
3 import java.util.Collections;
4 import java.util.Iterator;
5 import java.util.List;
6
7 import org.apache.log4j.Category;
8
9 import com.atlassian.configurable.ObjectConfigurationException;
10 import com.atlassian.jira.ComponentManager;
11 import com.atlassian.jira.ManagerFactory;
12 import com.atlassian.jira.exception.DataAccessException;
13 import com.atlassian.jira.issue.Issue;
14 import com.atlassian.jira.issue.IssueManager;
15 import com.atlassian.jira.issue.IssueUtilsBean;
16 import com.atlassian.jira.issue.MutableIssue;
17 import com.atlassian.jira.issue.search.SearchException;
18 import com.atlassian.jira.issue.search.SearchProvider;
19 import com.atlassian.jira.issue.search.SearchRequest;
20 import com.atlassian.jira.issue.search.SearchRequestManager;
21 import com.atlassian.jira.issue.search.SearchResults;
22 import com.atlassian.jira.security.JiraAuthenticationContext;
23 import com.atlassian.jira.security.JiraAuthenticationContextImpl;
24 import com.atlassian.jira.web.bean.PagerFilter;
25 import com.opensymphony.module.propertyset.PropertySet;
26 import com.opensymphony.user.EntityNotFoundException;
27 import com.opensymphony.user.User;
28 import com.opensymphony.user.UserManager;
29
30
31
32
33
34
35
36
37
38 public abstract class ARequestAwareService extends AbstractService implements IResquestAwareService {
39
40 private static final Category log = Category.getInstance(ARequestAwareService.class);
41
42
43
44 protected SearchRequestManager searchRequestManager;
45
46 protected IssueManager issueManager;
47
48 protected UserManager userManager;
49
50 protected SearchProvider searchProvider;
51
52 protected JiraAuthenticationContext authenticationContext;
53
54 protected IssueUtilsBean issueUtilsBean;
55
56
57
58 private String requestId;
59
60 private User userSearcher;
61
62
63
64
65 public ARequestAwareService() {
66 searchRequestManager = (SearchRequestManager) ComponentManager.getComponentInstanceOfType(SearchRequestManager.class);
67 searchProvider = (SearchProvider) ComponentManager.getComponentInstanceOfType(SearchProvider.class);
68 authenticationContext = (JiraAuthenticationContext) ComponentManager.getComponentInstanceOfType(JiraAuthenticationContext.class);
69 issueUtilsBean = (IssueUtilsBean) ComponentManager.getComponentInstanceOfType(IssueUtilsBean.class);
70 issueManager = ManagerFactory.getIssueManager();
71 userManager = UserManager.getInstance();
72 }
73
74
75
76
77 public void run() {
78
79 User previousUser = authenticationContext.getUser();
80
81
82 try {
83 authenticationContext.setUser(getUserSearcher());
84 JiraAuthenticationContextImpl.clearRequestCache();
85
86 validate();
87 runService();
88
89 } catch (ServiceException e) {
90 log.error("[" + getName() + " Service] failed ...");
91 e.printStackTrace();
92 } finally {
93
94 authenticationContext.setUser(previousUser);
95 JiraAuthenticationContextImpl.clearRequestCache();
96 }
97 }
98
99
100
101
102 public abstract void validate() throws ServiceException;
103
104
105
106
107 public void runService() throws ServiceException {
108 log.info("[" + getName() + " Service] started ...");
109
110 List issues = getIssues();
111
112 runServiceOnIssues(issues);
113 log.info("[" + getName() + " Service] ended ...");
114 }
115
116
117
118
119 public void runServiceOnIssues(final List _issues) throws ServiceException {
120 log.info("[" + getName() + " Service] " + _issues.size() + " issues to scan ...");
121
122 for (Iterator iterator = _issues.iterator(); iterator.hasNext();) {
123 Issue issue = (Issue) iterator.next();
124 MutableIssue mIssue = issueManager.getIssueObject(issue.getId());
125 runServiceOnIssue(mIssue);
126 }
127 }
128
129
130
131
132 public abstract void runServiceOnIssue(final MutableIssue _issue) throws ServiceException;
133
134
135
136
137 protected void setUserSearcher(final User _userSearcher) {
138 userSearcher = _userSearcher;
139 }
140
141
142
143
144 public User getUserSearcher() {
145 return userSearcher;
146 }
147
148
149
150
151
152
153 public void init(final PropertySet _props) throws ObjectConfigurationException {
154 super.init(_props);
155 if (hasProperty(IResquestAwareService.REQUEST_KEY)) {
156 requestId = getProperty(IResquestAwareService.REQUEST_KEY);
157 }
158 if (hasProperty(IResquestAwareService.SEARCHER_KEY)) {
159 userSearcher = getDefaultSearcher(getProperty(IResquestAwareService.SEARCHER_KEY));
160 }
161 }
162
163
164
165
166
167 protected User getDefaultSearcher(final String _searcherName) {
168 User searcherUser;
169 try {
170 searcherUser = userManager.getUser(_searcherName);
171 } catch (EntityNotFoundException e) {
172 log.error("Service configuration error: cannot find user (" + _searcherName + ").");
173 return null;
174 }
175 return searcherUser;
176 }
177
178
179
180
181 public SearchRequest getSearchRequest() {
182 SearchRequest sr = null;
183 if (requestId != null && !requestId.equals("-1") && !requestId.equals("")) {
184 sr = getSearchRequest(Long.valueOf(requestId));
185 }
186 return sr;
187 }
188
189
190
191
192
193 protected SearchRequest getSearchRequest(final Long filterId) {
194 try {
195 return searchRequestManager.getSearchRequest(getUserSearcher(), filterId);
196 } catch (DataAccessException e) {
197 log.error(e, e);
198 }
199 return null;
200 }
201
202
203
204
205
206
207
208 protected SearchResults getSearchResults(final SearchRequest _searchRequest) {
209 if (_searchRequest == null) {
210 return null;
211 }
212 try {
213 return searchProvider.search(_searchRequest, getUserSearcher(), PagerFilter.getUnlimitedFilter());
214 } catch (SearchException e) {
215 log.error("Could not get issues", e);
216 return null;
217 }
218 }
219
220
221
222
223 protected List getIssues() {
224 List issues;
225 SearchRequest srq = getSearchRequest();
226 SearchResults srs = getSearchResults(srq);
227 if (srs != null) {
228 issues = srs.getIssues();
229 } else {
230 issues = Collections.EMPTY_LIST;
231 }
232 return issues;
233 }
234
235 }