PageRenderTime 28ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/com/atlassian/jconnect/jira/DefaultJMCProjectService.java

https://bitbucket.org/atlassian/jiraconnect-jiraplugin/
Java | 167 lines | 131 code | 29 blank | 7 comment | 3 complexity | 07f1fac46f6b0183a80028f51206ccdf MD5 | raw file
  1. package com.atlassian.jconnect.jira;
  2. import java.util.Map;
  3. import java.util.UUID;
  4. import javax.annotation.Nullable;
  5. import com.atlassian.crowd.embedded.api.User;
  6. import com.atlassian.jconnect.jira.customfields.BuiltInField;
  7. import com.atlassian.jconnect.jira.customfields.CustomFieldHelper;
  8. import com.atlassian.jconnect.jira.customfields.CustomFieldSchemeHelper;
  9. import com.atlassian.jira.bc.issue.search.SearchService;
  10. import com.atlassian.jira.issue.CustomFieldManager;
  11. import com.atlassian.jira.issue.fields.CustomField;
  12. import com.atlassian.jira.issue.fields.FieldManager;
  13. import com.atlassian.jira.issue.search.SearchException;
  14. import com.atlassian.jira.jql.builder.JqlQueryBuilder;
  15. import com.atlassian.jira.project.Project;
  16. import com.atlassian.jira.propertyset.JiraPropertySetFactory;
  17. import com.atlassian.query.Query;
  18. import com.google.common.base.Function;
  19. import com.google.common.collect.MapMaker;
  20. import com.opensymphony.module.propertyset.PropertySet;
  21. import org.slf4j.Logger;
  22. import org.slf4j.LoggerFactory;
  23. /**
  24. * Default implementation of {@link JMCProjectService}.
  25. */
  26. public class DefaultJMCProjectService implements JMCProjectService {
  27. private final CustomFieldHelper customFieldHelper;
  28. private final CustomFieldSchemeHelper customFieldSchemeHelper;
  29. private final FieldManager fieldManager;
  30. private final JiraPropertySetFactory propertySetFactory;
  31. private final SearchService searchService;
  32. private final CustomFieldManager customFieldManager;
  33. private static final String PROPERTY_API_KEY = "jmc.api.key";
  34. private static final String PROPERTY_API_KEY_ENABLED = "jmc.api.key.enabled";
  35. private static final String PROPERTY_CRASHES_ENABLED = "jmc.crashes.enabled";
  36. private static final Logger log = LoggerFactory.getLogger(DefaultJMCProjectService.class);
  37. private Map<Long, PropertySet> configCache = new MapMaker().concurrencyLevel(8).makeComputingMap(new Function<Long, PropertySet>() {
  38. public PropertySet apply(@Nullable Long pid) {
  39. return propertySetFactory.buildCachingPropertySet(PluginInfo.JMC_PLUGIN_ID, pid, true);
  40. }
  41. });
  42. public DefaultJMCProjectService(CustomFieldHelper customFieldHelper,
  43. CustomFieldSchemeHelper customFieldSchemeHelper,
  44. FieldManager fieldManager,
  45. JiraPropertySetFactory propertySetFactory,
  46. SearchService searchService, CustomFieldManager customFieldManager) {
  47. this.customFieldHelper = customFieldHelper;
  48. this.customFieldSchemeHelper = customFieldSchemeHelper;
  49. this.fieldManager = fieldManager;
  50. this.propertySetFactory = propertySetFactory;
  51. this.searchService = searchService;
  52. this.customFieldManager = customFieldManager;
  53. }
  54. public boolean reindexRequiredFor(Project project, User user) {
  55. Query query = JqlQueryBuilder.newBuilder().where()
  56. .project().eq(project.getId())
  57. .buildQuery();
  58. try {
  59. // if there is at least 1 issue a re-index is required
  60. return this.searchService.searchCount(user, query) > 0;
  61. } catch (SearchException e) {
  62. log.warn(e.getMessage(), e);
  63. return false;
  64. }
  65. }
  66. public String generateApiKeyFor(Project project) {
  67. final PropertySet propertySet = getPropertySet(project);
  68. return addApiKey(propertySet);
  69. }
  70. public boolean toggleApiKeyFor(Project project, boolean enable) {
  71. final PropertySet propertySet = getPropertySet(project);
  72. setApiKeyEnabledState(propertySet, enable);
  73. return enable;
  74. }
  75. public boolean isApiKeyEnabledFor(Project project) {
  76. final PropertySet propertySet = getPropertySet(project);
  77. return propertySet.getBoolean(PROPERTY_API_KEY_ENABLED);
  78. }
  79. public boolean isCrashesEnabledFor(Project project) {
  80. final PropertySet propertySet = getPropertySet(project);
  81. // for backwards compatibility, if this prop is missing, default to ENABLED.
  82. if (!propertySet.exists(PROPERTY_CRASHES_ENABLED))
  83. {
  84. return true;
  85. }
  86. return propertySet.getBoolean(PROPERTY_CRASHES_ENABLED);
  87. }
  88. public boolean toggleCrashesFor(Project project, boolean enable) {
  89. final PropertySet propertySet = getPropertySet(project);
  90. propertySet.setBoolean(PROPERTY_CRASHES_ENABLED, enable);
  91. return enable;
  92. }
  93. public String lookupApiKeyFor(Project project) {
  94. final PropertySet propertySet = getPropertySet(project);
  95. return propertySet.getString(PROPERTY_API_KEY);
  96. }
  97. public String generateOrRetrieveAPIKeyFor(Project project) {
  98. final PropertySet propertySet = getPropertySet(project);
  99. setApiKeyEnabledState(propertySet, true);
  100. String currentKey = propertySet.getString(PROPERTY_API_KEY);
  101. if (currentKey == null) {
  102. currentKey = addApiKey(propertySet);
  103. }
  104. return currentKey;
  105. }
  106. private PropertySet getPropertySet(Project project) {
  107. return configCache.get(project.getId());
  108. }
  109. private void setApiKeyEnabledState(PropertySet propertySet, boolean enable) {
  110. propertySet.setBoolean(PROPERTY_API_KEY_ENABLED, enable);
  111. }
  112. private String addApiKey(PropertySet propertySet) {
  113. final String apiKey = UUID.randomUUID().toString();
  114. propertySet.setString(PROPERTY_API_KEY, apiKey);
  115. return apiKey;
  116. }
  117. public boolean toggleForJiraConnect(Project project) {
  118. final boolean isEnabled = isJiraConnectProject(project);
  119. // if project is currently enabled, it will be disabled. ie. custom fields removed
  120. customFieldSchemeHelper.toggleFieldsToProjectScheme(!isEnabled, project, BuiltInField.values());
  121. fieldManager.refresh();
  122. return isJiraConnectProject(project); // check the status of the project
  123. }
  124. public boolean isJiraConnectProject(Project project) {
  125. // a project is a JMC project if it contains all custom fields
  126. return customFieldHelper.containsAllFields(project, customFieldHelper.getAllBuiltInCustomFields());
  127. }
  128. public long countJMCIssues(User user) {
  129. final CustomField uuidField = this.customFieldManager.getCustomFieldObjectByName(BuiltInField.UUID.fieldName());
  130. Query query = JqlQueryBuilder.newBuilder().where().customField(uuidField.getIdAsLong()).notEqEmpty().buildQuery();
  131. try {
  132. return this.searchService.searchCount(user, query);
  133. } catch (SearchException e) {
  134. log.error(e.getMessage(), e);
  135. }
  136. return -1;
  137. }
  138. }