View Javadoc

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   * FQCN : com.atlassian.jira.service.ARequestAwareService
32   * @author Kaamelot
33   * @since 3.10.1.34
34   * @version 3.10.1.34
35   * Description :
36   *
37   */
38  public abstract class ARequestAwareService extends AbstractService implements IResquestAwareService {
39  
40  	private static final Category log = Category.getInstance(ARequestAwareService.class);
41  	
42  	// -- Service Parameters Key
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  	// -- Service Parameters
57  
58  	private String requestId;
59  
60  	private User userSearcher;
61  
62  	/**
63  	 * Constructor
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  	 * Apply User Context and Run Service core
76  	 */
77  	public void run() {
78  		// Remember the current user
79  		User previousUser = authenticationContext.getUser();
80  
81  		// Execute as specified user
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  			// Restores the user
94  			authenticationContext.setUser(previousUser);
95  			JiraAuthenticationContextImpl.clearRequestCache();
96  		}
97  	}
98  	
99  	/**
100 	 * @see com.atlassian.jira.service.IResquestAwareService#validate()
101 	 */
102 	public abstract void validate() throws ServiceException;
103 
104 	/**
105 	 * @see com.atlassian.jira.service.IResquestAwareService#runService()
106 	 */
107 	public void runService() throws ServiceException {
108 		log.info("[" + getName() + " Service] started ...");
109 		// Retrieves Issues to scan
110 		List issues = getIssues();
111 		// Perform Service Task on Issues
112 		runServiceOnIssues(issues);
113 		log.info("[" + getName() + " Service] ended ...");
114 	}
115 
116 	/**
117 	 * @see com.atlassian.jira.service.IResquestAwareService#runServiceOnIssues(java.util.List)
118 	 */
119 	public void runServiceOnIssues(final List _issues) throws ServiceException {
120 		log.info("[" + getName() + " Service] " + _issues.size() + " issues to scan ...");
121 		// Loop on each Issue
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 	 * @see com.atlassian.jira.service.IResquestAwareService#runServiceOnIssue(com.atlassian.jira.issue.MutableIssue)
131 	 */
132 	public abstract void runServiceOnIssue(final MutableIssue _issue) throws ServiceException;
133 	
134 	/**
135 	 * @param _userSearcher  User used as Requester
136 	 */
137 	protected void setUserSearcher(final User _userSearcher) {
138 		userSearcher = _userSearcher;
139 	}
140 
141 	/**
142 	 * @return User used as Requester 
143 	 */
144 	public User getUserSearcher() {
145 		return userSearcher;
146 	}
147 
148 	/**
149 	 * Service Initialisation
150 	 * @param _props Properies to use for Initialisation
151 	 * @throws ObjectConfigurationException  
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 	 * @param _searcherName User Name provided by Service Parameters
165 	 * @return Associated User
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 	 * @return A SearchRequest depending on Service Parameters
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 	 * @param filterId SearchRequest Id.
191 	 * @return SearchRequest retrieved by its id. NULL if the request do not exist. 
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 	 * Returns search results if the user is logged in and search request passed in is not null
204 	 * 
205 	 * @param _searchRequest Search Request
206 	 * @return search results
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 	 * @return List of Issues
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 }