PageRenderTime 49ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/jira-project/jira-components/jira-plugins/jira-gadgets-plugin/src/main/java/com/atlassian/jira/gadgets/system/SearchQueryBackedResource.java

https://bitbucket.org/ahmed_bilal_360factors/jira7-core
Java | 158 lines | 119 code | 10 blank | 29 comment | 34 complexity | d4f2cc0925923fa0c6e6323ba168adc9 MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.atlassian.jira.gadgets.system;
  2. import com.atlassian.jira.bc.issue.search.SearchService;
  3. import com.atlassian.jira.charts.util.ChartUtils;
  4. import com.atlassian.jira.issue.search.SearchRequest;
  5. import com.atlassian.jira.jql.builder.JqlQueryBuilder;
  6. import com.atlassian.jira.project.Project;
  7. import com.atlassian.jira.rest.v1.model.errors.ValidationError;
  8. import com.atlassian.jira.security.JiraAuthenticationContext;
  9. import com.atlassian.jira.security.PermissionManager;
  10. import com.atlassian.jira.security.Permissions;
  11. import com.atlassian.jira.util.velocity.VelocityRequestContextFactory;
  12. import com.atlassian.query.Query;
  13. import com.atlassian.query.QueryImpl;
  14. import org.apache.commons.lang.StringUtils;
  15. import java.util.Collection;
  16. import java.util.Map;
  17. import static com.atlassian.jira.permission.ProjectPermissions.BROWSE_PROJECTS;
  18. /**
  19. * An abstract class used for common search request handling for search request backed resources.
  20. *
  21. * @since v4.0
  22. */
  23. public abstract class SearchQueryBackedResource extends AbstractResource {
  24. protected static final String QUERY_STRING = "projectOrFilterId";
  25. static final String PROJECT = "project";
  26. private static final String SEARCH_REQUEST = "searchRequest";
  27. protected final ChartUtils chartUtils;
  28. protected final JiraAuthenticationContext authenticationContext;
  29. protected final PermissionManager permissionManager;
  30. private VelocityRequestContextFactory velocityRequestContextFactory;
  31. protected final SearchService searchService;
  32. private static final String FILTER_PREFIX = "filter-";
  33. private static final String PROJECT_PREFIX = "project-";
  34. private static final String JQL_PREFIX = "jql-";
  35. public SearchQueryBackedResource(
  36. final ChartUtils chartUtils,
  37. final JiraAuthenticationContext authenticationContext,
  38. final SearchService searchService,
  39. final PermissionManager permissionManager,
  40. final VelocityRequestContextFactory velocityRequestContextFactory) {
  41. this.chartUtils = chartUtils;
  42. this.authenticationContext = authenticationContext;
  43. this.searchService = searchService;
  44. this.permissionManager = permissionManager;
  45. this.velocityRequestContextFactory = velocityRequestContextFactory;
  46. }
  47. /**
  48. * Method used for retrieving/building a SearchRequest and validating params.
  49. *
  50. * @param queryString a String containing a search criteria. Starts with "filter-" for a search request, "project-"
  51. * for a project or "jql-" for a jql equest.
  52. * @param errors a collection of {@link com.atlassian.jira.rest.v1.model.errors.ValidationError} object
  53. * containing all validation message keys.
  54. * @param params a map to populate with with appropriate entities.
  55. * @return a {@link com.atlassian.jira.issue.search.SearchRequest} that will restrict the search to the given
  56. * criteria
  57. */
  58. protected SearchRequest getSearchRequestAndValidate(String queryString, Collection<ValidationError> errors, Map<String, Object> params) {
  59. SearchRequest searchRequest;
  60. if (StringUtils.isNotEmpty(queryString)) {
  61. params.put(QUERY_STRING, queryString);
  62. searchRequest = chartUtils.retrieveOrMakeSearchRequest(queryString, params);
  63. validateParams(errors, params);
  64. if (!errors.isEmpty()) {
  65. searchRequest = null;
  66. }
  67. } else {
  68. errors.add(new ValidationError(QUERY_STRING, "dashboard.item.error.required.query"));
  69. searchRequest = null;
  70. }
  71. return searchRequest;
  72. }
  73. private void validateParams(Collection<ValidationError> errors, Map<String, Object> params) {
  74. final String queryString = (String) params.get(QUERY_STRING);
  75. if (queryString.startsWith(FILTER_PREFIX)) {
  76. if (params.get(SEARCH_REQUEST) == null) {
  77. errors.add(new ValidationError(QUERY_STRING, "dashboard.item.error.invalid.filter"));
  78. }
  79. } else if (queryString.startsWith(PROJECT_PREFIX)) {
  80. if (params.get(PROJECT) == null) {
  81. errors.add(new ValidationError(QUERY_STRING, "dashboard.item.error.invalid.project"));
  82. } else {
  83. if (!permissionManager.hasPermission(BROWSE_PROJECTS, (Project) params.get(PROJECT), authenticationContext.getLoggedInUser())) {
  84. errors.add(new ValidationError(QUERY_STRING, "dashboard.item.error.invalid.project"));
  85. }
  86. }
  87. } else if (queryString.startsWith(JQL_PREFIX)) {
  88. if (params.get(SEARCH_REQUEST) == null) {
  89. errors.add(new ValidationError(QUERY_STRING, "dashboard.item.error.invalid.jql"));
  90. }
  91. } else {
  92. errors.add(new ValidationError(QUERY_STRING, "dashboard.item.error.invalid.projectOrFilterId"));
  93. }
  94. }
  95. /**
  96. * Get the name to display for the given query.
  97. *
  98. * @param params The params created during chart generation process.
  99. * @return For a project, get the project name. For a saved filter, get the name. For a unsaved search, return the
  100. * anonymous key.
  101. */
  102. protected String getFilterTitle(final Map<String, Object> params) {
  103. if (params.containsKey(PROJECT)) {
  104. return ((Project) params.get(PROJECT)).getName();
  105. } else if (params.containsKey(SEARCH_REQUEST)) {
  106. return ((SearchRequest) params.get(SEARCH_REQUEST)).getName();
  107. } else {
  108. return "dashboard.item.anonymous.filter";
  109. }
  110. }
  111. /**
  112. * Get the url to send people to for this search.
  113. *
  114. * @param params The params created during chart generation process.
  115. * @return For a project or filter, send them to the issue navigator. For an unsaved search, return empty string.
  116. */
  117. protected String getFilterUrl(final Map<String, Object> params) {
  118. if (params.containsKey(PROJECT)) {
  119. final Project project = (Project) params.get(PROJECT);
  120. final Query query = JqlQueryBuilder.newBuilder().where().project().eq(project.getKey()).buildQuery();
  121. return searchService.getIssueSearchPath(authenticationContext.getLoggedInUser(),
  122. SearchService.IssueSearchParameters.builder().query(query).build());
  123. } else if (params.containsKey(SEARCH_REQUEST)) {
  124. final SearchRequest request = (SearchRequest) params.get(SEARCH_REQUEST);
  125. if (request != null && request.isLoaded() && request.getId() != null) {
  126. return searchService.getIssueSearchPath(authenticationContext.getLoggedInUser(),
  127. SearchService.IssueSearchParameters.builder().filterId(request.getId()).build());
  128. } else {
  129. return searchService.getIssueSearchPath(authenticationContext.getLoggedInUser(),
  130. SearchService.IssueSearchParameters.builder().query((request == null) ? new QueryImpl() : request.getQuery()).build());
  131. }
  132. } else {
  133. return "";
  134. }
  135. }
  136. String createIndexingUnavailableMessage() {
  137. final String msg1 = authenticationContext.getI18nHelper().getText("dashboard.item.indexing.not.configured");
  138. String msg2;
  139. if (permissionManager.hasPermission(Permissions.ADMINISTER, authenticationContext.getLoggedInUser())) {
  140. String baseUrl = velocityRequestContextFactory.getJiraVelocityRequestContext().getBaseUrl();
  141. msg2 = authenticationContext.getI18nHelper().getText("dashboard.item.indexing.configure",
  142. "<a href=\"" + baseUrl + "/secure/admin/jira/IndexAdmin.jspa\">", "</a>");
  143. } else {
  144. msg2 = authenticationContext.getI18nHelper().getText("dashboard.item.indexing.admin");
  145. }
  146. return msg1 + " " + msg2;
  147. }
  148. }