PageRenderTime 36ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/jira-project/jira-components/jira-core/src/main/java/com/atlassian/jira/web/action/admin/issuefields/screens/ViewFieldScreens.java

https://bitbucket.org/ahmed_bilal_360factors/jira7-core
Java | 234 lines | 179 code | 41 blank | 14 comment | 25 complexity | bbdaaa5a2f4b3e9bde14c1fc8275bf53 MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.atlassian.jira.web.action.admin.issuefields.screens;
  2. import com.atlassian.jira.issue.fields.screen.FieldScreen;
  3. import com.atlassian.jira.issue.fields.screen.FieldScreenFactory;
  4. import com.atlassian.jira.issue.fields.screen.FieldScreenManager;
  5. import com.atlassian.jira.issue.fields.screen.FieldScreenSchemeManager;
  6. import com.atlassian.jira.security.xsrf.RequiresXsrfCheck;
  7. import com.atlassian.jira.workflow.JiraWorkflow;
  8. import com.atlassian.jira.workflow.WorkflowManager;
  9. import com.atlassian.sal.api.websudo.WebSudoRequired;
  10. import com.opensymphony.util.TextUtils;
  11. import com.opensymphony.workflow.loader.ActionDescriptor;
  12. import com.opensymphony.workflow.loader.StepDescriptor;
  13. import java.util.ArrayList;
  14. import java.util.Collection;
  15. import java.util.Collections;
  16. import java.util.HashMap;
  17. import java.util.List;
  18. import java.util.Map;
  19. import java.util.TreeMap;
  20. import static com.atlassian.jira.util.lang.JiraStringUtils.asString;
  21. /**
  22. * Copyright (c) 2002-2004
  23. * All rights reserved.
  24. */
  25. @WebSudoRequired
  26. public class ViewFieldScreens extends AbstractFieldScreenAction {
  27. private String confirm;
  28. private Map fieldScreenSchemeMap;
  29. private final FieldScreenFactory fieldScreenFactory;
  30. private final FieldScreenSchemeManager fieldScreenSchemeManager;
  31. private final WorkflowManager workflowManager;
  32. private List<JiraWorkflow> workflowsIncludingDrafts;
  33. public ViewFieldScreens(FieldScreenManager fieldScreenManager, FieldScreenFactory fieldScreenFactory,
  34. FieldScreenSchemeManager fieldScreenSchemeManager, WorkflowManager workflowManager) {
  35. super(fieldScreenManager);
  36. this.fieldScreenFactory = fieldScreenFactory;
  37. this.fieldScreenSchemeManager = fieldScreenSchemeManager;
  38. this.workflowManager = workflowManager;
  39. fieldScreenSchemeMap = new HashMap();
  40. }
  41. protected String doExecute() throws Exception {
  42. return getResult();
  43. }
  44. public String doAddNewFieldScreen() throws Exception {
  45. return INPUT;
  46. }
  47. @RequiresXsrfCheck
  48. public String doAddFieldScreen() {
  49. // Ensure no screen with this name already exists
  50. validateScreenName();
  51. if (!invalidInput()) {
  52. FieldScreen fieldScreen = fieldScreenFactory.createScreen();
  53. fieldScreen.setName(getFieldScreenName());
  54. fieldScreen.setDescription(getFieldScreenDescription());
  55. fieldScreen.store();
  56. fieldScreen.addTab(getText("admin.field.screen.default"));
  57. return returnCompleteWithInlineRedirect("ConfigureFieldScreen.jspa?id=" + fieldScreen.getId());
  58. } else {
  59. return ERROR;
  60. }
  61. }
  62. public String doViewDeleteFieldScreen() {
  63. validateId();
  64. if (invalidInput()) {
  65. return getResult();
  66. }
  67. // Ensure the field screen is not used in any Field Screen Schemes
  68. if (!isDeletable(getFieldScreen())) {
  69. addErrorMessage(getText("admin.errors.screens.cannot.delete.screen.used.screen.schemes"));
  70. }
  71. if (!TextUtils.stringSet(confirm)) {
  72. return "confirm";
  73. }
  74. return redirectToView();
  75. }
  76. @RequiresXsrfCheck
  77. public String doDeleteFieldScreen() {
  78. validateId();
  79. if (invalidInput()) {
  80. return getResult();
  81. }
  82. // Ensure the field screen is not used in any Field Screen Schemes
  83. if (!isDeletable(getFieldScreen())) {
  84. addErrorMessage(getText("admin.errors.screens.cannot.delete.screen.used.screen.schemes"));
  85. }
  86. getFieldScreen().remove();
  87. return redirectToView();
  88. }
  89. public String getConfirm() {
  90. return confirm;
  91. }
  92. public void setConfirm(String confirm) {
  93. this.confirm = confirm;
  94. }
  95. public Collection getFieldScreenSchemes(FieldScreen fieldScreen) {
  96. // Use id for caching as it hashCOde and equals methods are so much simpler :)
  97. if (!fieldScreenSchemeMap.containsKey(fieldScreen.getId())) {
  98. fieldScreenSchemeMap.put(fieldScreen.getId(), fieldScreenSchemeManager.getFieldScreenSchemes(fieldScreen));
  99. }
  100. return (Collection) fieldScreenSchemeMap.get(fieldScreen.getId());
  101. }
  102. public Map<JiraWorkflow, Collection<ActionDescriptor>> getWorkflows(FieldScreen fieldScreen) {
  103. Map<JiraWorkflow, Collection<ActionDescriptor>> workflows = new TreeMap<JiraWorkflow, Collection<ActionDescriptor>>();
  104. for (final JiraWorkflow workflow : workflowManager.getWorkflows()) {
  105. Collection<ActionDescriptor> actions = workflow.getActionsForScreen(fieldScreen);
  106. if (actions != null && !actions.isEmpty()) {
  107. workflows.put(workflow, actions);
  108. }
  109. }
  110. return workflows;
  111. }
  112. public Collection<WorkflowTransitionViewHelper> getWorkflowTransitionViews(FieldScreen fieldScreen) {
  113. List<WorkflowTransitionViewHelper> answer = new ArrayList<WorkflowTransitionViewHelper>();
  114. for (final JiraWorkflow workflow : workflowManager.getWorkflows()) {
  115. Collection<ActionDescriptor> actions = workflow.getActionsForScreen(fieldScreen);
  116. if (actions != null && !actions.isEmpty()) {
  117. for (ActionDescriptor action : actions) {
  118. answer.add(new WorkflowTransitionViewHelper(workflow, action));
  119. }
  120. }
  121. }
  122. Collections.sort(answer);
  123. return answer;
  124. }
  125. private boolean hasWorkflowsIncludingDrafts(FieldScreen fieldScreen) {
  126. for (JiraWorkflow workflow : getWorkflowsIncludingDrafts()) {
  127. Collection<ActionDescriptor> actions = workflow.getActionsForScreen(fieldScreen);
  128. if (actions != null && !actions.isEmpty()) {
  129. return true;
  130. }
  131. }
  132. return false;
  133. }
  134. private List<JiraWorkflow> getWorkflowsIncludingDrafts() {
  135. // Cache this call as it is expensive.
  136. if (workflowsIncludingDrafts == null) {
  137. workflowsIncludingDrafts = workflowManager.getWorkflowsIncludingDrafts();
  138. }
  139. return workflowsIncludingDrafts;
  140. }
  141. public boolean isDeletable(FieldScreen fieldScreen) {
  142. // Check if the field screen is used by any field screen schemes or workflows;
  143. return getFieldScreenSchemes(fieldScreen).isEmpty() && !hasWorkflowsIncludingDrafts(fieldScreen);
  144. }
  145. /**
  146. * Facilitates creating view list of the workflow transitions for the viewfieldscreen
  147. * page purposes.
  148. */
  149. public static class WorkflowTransitionViewHelper implements Comparable<WorkflowTransitionViewHelper> {
  150. private final JiraWorkflow workflow;
  151. private final ActionDescriptor transition;
  152. private final Collection<StepDescriptor> steps;
  153. private WorkflowTransitionViewHelper(final JiraWorkflow workflow, final ActionDescriptor transition) {
  154. this.workflow = workflow;
  155. this.transition = transition;
  156. this.steps = initTransitionSteps();
  157. }
  158. private Collection<StepDescriptor> initTransitionSteps() {
  159. return workflow.getStepsForTransition(transition);
  160. }
  161. public int compareTo(final WorkflowTransitionViewHelper other) {
  162. return this.workflow.compareTo(other.workflow);
  163. }
  164. public String getWorkflowName() {
  165. return workflow.getName();
  166. }
  167. public String getWorkflowMode() {
  168. return workflow.getMode();
  169. }
  170. public String getTransitionName() {
  171. return transition.getName();
  172. }
  173. public int transitionId() {
  174. return transition.getId();
  175. }
  176. public boolean hasSteps() {
  177. return !steps.isEmpty();
  178. }
  179. public StepDescriptor getFirstStep() {
  180. if (!hasSteps()) {
  181. throw new IllegalStateException("No steps for " + this);
  182. }
  183. return steps.iterator().next();
  184. }
  185. public boolean isGlobalAction() {
  186. return workflow.isGlobalAction(transition);
  187. }
  188. @Override
  189. public String toString() {
  190. return asString("WorkflowTransition[Workflow=", workflow.getName(), ",transition=", transition.getId(), "]");
  191. }
  192. }
  193. }