PageRenderTime 44ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/src/main/java/com/atlassian/jconnect/jira/customfields/CustomFieldSchemeHelper.java

https://bitbucket.org/atlassian/jiraconnect-jiraplugin/
Java | 120 lines | 97 code | 19 blank | 4 comment | 15 complexity | 43614bc6218c89da5acf69d9c947a53e MD5 | raw file
  1. package com.atlassian.jconnect.jira.customfields;
  2. import com.atlassian.jira.issue.context.GlobalIssueContext;
  3. import com.atlassian.jira.issue.context.JiraContextNode;
  4. import com.atlassian.jira.issue.context.ProjectContext;
  5. import com.atlassian.jira.issue.fields.CustomField;
  6. import com.atlassian.jira.issue.fields.config.FieldConfigScheme;
  7. import com.atlassian.jira.issue.fields.config.manager.FieldConfigSchemeManager;
  8. import com.atlassian.jira.issue.fields.config.manager.IssueTypeSchemeManager;
  9. import com.atlassian.jira.issue.fields.screen.*;
  10. import com.atlassian.jira.issue.fields.screen.issuetype.IssueTypeScreenScheme;
  11. import com.atlassian.jira.issue.fields.screen.issuetype.IssueTypeScreenSchemeEntity;
  12. import com.atlassian.jira.issue.fields.screen.issuetype.IssueTypeScreenSchemeManager;
  13. import com.atlassian.jira.issue.operation.IssueOperations;
  14. import com.atlassian.jira.project.Project;
  15. import com.google.common.collect.ImmutableList;
  16. import java.util.Collection;
  17. import java.util.List;
  18. /**
  19. * Utility component to manage custom field schemes for JIRA Connect fields
  20. *
  21. */
  22. public class CustomFieldSchemeHelper {
  23. private final CustomFieldHelper customFieldHelper;
  24. private final IssueTypeSchemeManager issueTypeManager;
  25. private final IssueTypeScreenSchemeManager issueTypeScreenSchemeManager;
  26. private final FieldConfigSchemeManager fieldConfigSchemeManager;
  27. private final FieldScreenManager fieldScreenManager;
  28. private final FieldScreenSchemeManager fieldScreenSchemeManager;
  29. public CustomFieldSchemeHelper(CustomFieldHelper customFieldHelper,
  30. IssueTypeSchemeManager issueTypeManager,
  31. FieldConfigSchemeManager fieldConfigSchemeManager,
  32. FieldScreenManager fieldScreenManager,
  33. FieldScreenSchemeManager fieldScreenSchemeManager,
  34. IssueTypeScreenSchemeManager issueTypeScreenSchemeManager) {
  35. this.customFieldHelper = customFieldHelper;
  36. this.issueTypeManager = issueTypeManager;
  37. this.fieldConfigSchemeManager = fieldConfigSchemeManager;
  38. this.fieldScreenManager = fieldScreenManager;
  39. this.fieldScreenSchemeManager = fieldScreenSchemeManager;
  40. this.issueTypeScreenSchemeManager = issueTypeScreenSchemeManager;
  41. }
  42. public void toggleFieldsToProjectScheme(boolean addFields, Project project, BuiltInField... fields) {
  43. final List<String> issueTypeIds = issueTypeIdsFor(project);
  44. for (BuiltInField field : fields) {
  45. CustomField customField = customFieldHelper.initBuiltInCustomField(field);
  46. if (addFields) {
  47. if (!customField.isInScope(project, issueTypeIds)) {
  48. addFieldToScheme(project, field, customField);
  49. }
  50. if (field.isVisible()) // TODO: include opt-in variable for Location to be added to screens.
  51. {
  52. addToScreens(customField, project);
  53. }
  54. } else {
  55. removeFieldFromSchemeAndScreens(project, field, customField);
  56. }
  57. }
  58. fieldScreenManager.refresh();
  59. }
  60. private void removeFieldFromSchemeAndScreens(Project project, BuiltInField field, CustomField customField) {
  61. final List<FieldConfigScheme> configSchemes = customField.getConfigurationSchemes();
  62. final ProjectContext projectContext = new ProjectContext(project.getId());
  63. for (FieldConfigScheme scheme : configSchemes) {
  64. List<JiraContextNode> contextNodes = scheme.getContexts();
  65. if (contextNodes != null) {
  66. for (JiraContextNode contextNode : contextNodes) {
  67. if (contextNode.isInContext(projectContext) &&
  68. !(contextNode instanceof GlobalIssueContext)) {
  69. fieldConfigSchemeManager.removeFieldConfigScheme(scheme.getId());
  70. break;
  71. }
  72. }
  73. }
  74. }
  75. fieldConfigSchemeManager.removeSchemeAssociation(projectContext(project), customField);
  76. }
  77. private void addFieldToScheme(Project project, BuiltInField field, CustomField customField) {
  78. FieldConfigScheme scheme = fieldConfigSchemeManager.createDefaultScheme(customField, projectContext(project));
  79. }
  80. private void addToScreens(CustomField customField, Project project)
  81. {
  82. final IssueTypeScreenScheme screenScheme = this.issueTypeScreenSchemeManager.getIssueTypeScreenScheme(project.getGenericValue());
  83. Collection<IssueTypeScreenSchemeEntity> issueTypeScreenSchemeEntities = screenScheme.getEntities();
  84. for (IssueTypeScreenSchemeEntity schemeEntity : issueTypeScreenSchemeEntities)
  85. {
  86. final FieldScreenScheme fieldScreenScheme = schemeEntity.getFieldScreenScheme();
  87. final FieldScreen fieldScreen = fieldScreenScheme.getFieldScreen(IssueOperations.VIEW_ISSUE_OPERATION);
  88. if (fieldScreen != null && !fieldScreen.getTabs().isEmpty() && !fieldScreen.containsField(customField.getId()))
  89. {
  90. FieldScreenTab tab = fieldScreen.getTabs().iterator().next();
  91. tab.addFieldScreenLayoutItem(customField.getId());
  92. }
  93. }
  94. }
  95. private List<JiraContextNode> projectContext(Project project) {
  96. return ImmutableList.<JiraContextNode>of(new ProjectContext(project.getId()));
  97. }
  98. List<String> issueTypeIdsFor(Project project) {
  99. return CustomFieldHelper.issueTypeIdsFor(project, issueTypeManager);
  100. }
  101. }