/plugin/src/main/java/com/atlassian/plugin/remotable/plugin/module/jira/searchrequestview/RemoteSearchRequestView.java

https://bitbucket.org/rodogu/remotable-plugins · Java · 162 lines · 135 code · 20 blank · 7 comment · 1 complexity · afba3cf58c01a1283cf827f442966840 MD5 · raw file

  1. package com.atlassian.plugin.remotable.plugin.module.jira.searchrequestview;
  2. import com.atlassian.jira.ComponentManager;
  3. import com.atlassian.jira.exception.DataAccessException;
  4. import com.atlassian.jira.issue.Issue;
  5. import com.atlassian.jira.issue.search.SearchException;
  6. import com.atlassian.jira.issue.search.SearchRequest;
  7. import com.atlassian.jira.issue.views.SingleIssueWriter;
  8. import com.atlassian.jira.issue.views.util.SearchRequestViewBodyWriterUtil;
  9. import com.atlassian.jira.issue.views.util.SearchRequestViewUtils;
  10. import com.atlassian.jira.plugin.issueview.AbstractIssueView;
  11. import com.atlassian.jira.plugin.searchrequestview.RequestHeaders;
  12. import com.atlassian.jira.plugin.searchrequestview.SearchRequestParams;
  13. import com.atlassian.jira.plugin.searchrequestview.SearchRequestView;
  14. import com.atlassian.jira.plugin.searchrequestview.SearchRequestViewModuleDescriptor;
  15. import com.atlassian.jira.security.JiraAuthenticationContext;
  16. import com.atlassian.plugin.remotable.plugin.module.util.redirect.RedirectServlet;
  17. import com.atlassian.sal.api.ApplicationProperties;
  18. import com.atlassian.templaterenderer.TemplateRenderer;
  19. import com.google.common.collect.ImmutableMap;
  20. import org.apache.commons.lang.StringUtils;
  21. import java.io.IOException;
  22. import java.io.StringWriter;
  23. import java.io.Writer;
  24. import java.net.URI;
  25. import java.util.Map;
  26. import static com.google.common.collect.Maps.newHashMap;
  27. /**
  28. * A remote search request review that will do an html redirect to the remote plugin
  29. */
  30. public class RemoteSearchRequestView implements SearchRequestView
  31. {
  32. private final ApplicationProperties applicationProperties;
  33. private final SearchRequestViewBodyWriterUtil searchRequestViewBodyWriterUtil;
  34. private final TemplateRenderer templateRenderer;
  35. private final String appKey;
  36. private final URI path;
  37. private final String name;
  38. public RemoteSearchRequestView(
  39. ApplicationProperties applicationProperties,
  40. final SearchRequestViewBodyWriterUtil searchRequestViewBodyWriterUtil,
  41. TemplateRenderer templateRenderer, String appKey, URI path, String name)
  42. {
  43. this.applicationProperties = applicationProperties;
  44. this.searchRequestViewBodyWriterUtil = searchRequestViewBodyWriterUtil;
  45. this.templateRenderer = templateRenderer;
  46. this.appKey = appKey;
  47. this.path = path;
  48. this.name = name;
  49. }
  50. @Override
  51. public void init(SearchRequestViewModuleDescriptor moduleDescriptor)
  52. {
  53. }
  54. @Override
  55. public void writeHeaders(SearchRequest searchRequest, RequestHeaders requestHeaders,
  56. SearchRequestParams searchRequestParams)
  57. {
  58. }
  59. @Override
  60. public void writeSearchResults(final SearchRequest searchRequest, final SearchRequestParams searchRequestParams, final Writer writer)
  61. {
  62. JiraAuthenticationContext jiraAuthenticationContext = ComponentManager.getInstance().getJiraAuthenticationContext();
  63. Map<String,String> queryParams = newHashMap();
  64. String baseUrl = applicationProperties.getBaseUrl();
  65. queryParams.put("link", SearchRequestViewUtils.getLink(searchRequest,
  66. baseUrl, jiraAuthenticationContext.getLoggedInUser()));
  67. int startIssue = searchRequestParams.getPagerFilter().getStart();
  68. queryParams.put("startIssue", String.valueOf(startIssue));
  69. long totalIssues = getSearchCount(searchRequest, searchRequestParams);
  70. queryParams.put("totalIssues", String.valueOf(totalIssues));
  71. final long tempMax = searchRequestParams.getPagerFilter().getMax() < 0 ? 0 : searchRequestParams.getPagerFilter().getMax();
  72. queryParams.put("endIssue", String.valueOf(Math.min(startIssue + tempMax, totalIssues)));
  73. String issueKeysValue = getIssueKeysList(searchRequest, searchRequestParams);
  74. queryParams.put("issues", issueKeysValue);
  75. String redirectUrl = RedirectServlet.getOAuthRedirectUrl(baseUrl, appKey, path, queryParams);
  76. try
  77. {
  78. templateRenderer.render("velocity/view-search-request-redirect.vm", ImmutableMap.<String,
  79. Object>of(
  80. "redirectUrl", redirectUrl,
  81. "name", name
  82. ), writer);
  83. }
  84. catch (IOException e)
  85. {
  86. throw new DataAccessException(e);
  87. }
  88. }
  89. private String getIssueKeysList(SearchRequest searchRequest,
  90. SearchRequestParams searchRequestParams)
  91. {
  92. StringWriter issueKeys = new StringWriter();
  93. final SingleIssueWriter singleIssueWriter = new SingleIssueWriter()
  94. {
  95. public void writeIssue(final Issue issue, final AbstractIssueView issueView, final Writer writer)
  96. throws IOException
  97. {
  98. writer.write(issue.getKey());
  99. writer.write(",");
  100. }
  101. };
  102. try
  103. {
  104. searchRequestViewBodyWriterUtil.writeBody(issueKeys, null, searchRequest, singleIssueWriter,
  105. searchRequestParams.getPagerFilter());
  106. }
  107. catch (IOException e1)
  108. {
  109. throw new DataAccessException(e1);
  110. }
  111. catch (SearchException e1)
  112. {
  113. throw new DataAccessException(e1);
  114. }
  115. String issueKeysValue = issueKeys.toString();
  116. issueKeysValue = issueKeysValue.substring(0, issueKeysValue.length() - 1);
  117. return issueKeysValue;
  118. }
  119. /*
  120. * Get the total search count. The search count would first be retrieved from the SearchRequestParams. If not found,
  121. * retrieve using the search provider instead.
  122. */
  123. private long getSearchCount(final SearchRequest searchRequest, final SearchRequestParams searchRequestParams)
  124. {
  125. final String searchCount = (String) searchRequestParams.getSession().get("searchCount");
  126. if (StringUtils.isNumeric(searchCount))
  127. {
  128. return Long.parseLong(searchCount);
  129. }
  130. else
  131. {
  132. try
  133. {
  134. return searchRequestViewBodyWriterUtil.searchCount(searchRequest);
  135. }
  136. catch (final SearchException se)
  137. {
  138. return 0;
  139. }
  140. }
  141. }
  142. }