PageRenderTime 29ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/jira-project/jira-components/jira-core/src/main/java/com/atlassian/jira/auditing/handlers/ProjectEventHandlerImpl.java

https://bitbucket.org/ahmed_bilal_360factors/jira7-core
Java | 210 lines | 174 code | 32 blank | 4 comment | 14 complexity | 2d7585d7b9e25e3730ffb7b434d7d64a MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.atlassian.jira.auditing.handlers;
  2. import com.atlassian.fugue.Option;
  3. import com.atlassian.jira.auditing.AffectedProject;
  4. import com.atlassian.jira.auditing.AffectedUser;
  5. import com.atlassian.jira.auditing.AssociatedItem;
  6. import com.atlassian.jira.auditing.AuditingCategory;
  7. import com.atlassian.jira.auditing.ChangedValue;
  8. import com.atlassian.jira.auditing.RecordRequest;
  9. import com.atlassian.jira.event.ProjectCreatedEvent;
  10. import com.atlassian.jira.event.ProjectDeletedEvent;
  11. import com.atlassian.jira.event.ProjectUpdatedEvent;
  12. import com.atlassian.jira.event.project.ProjectAvatarUpdateEvent;
  13. import com.atlassian.jira.event.project.ProjectCategoryChangeEvent;
  14. import com.atlassian.jira.event.project.ProjectCategoryUpdateEvent;
  15. import com.atlassian.jira.event.role.ProjectRoleDeletedEvent;
  16. import com.atlassian.jira.event.role.ProjectRoleUpdatedEvent;
  17. import com.atlassian.jira.project.Project;
  18. import com.atlassian.jira.project.ProjectAssigneeTypes;
  19. import com.atlassian.jira.project.ProjectCategory;
  20. import com.atlassian.jira.project.ProjectManager;
  21. import com.atlassian.jira.security.roles.ProjectRoleActor;
  22. import com.atlassian.jira.security.roles.ProjectRoleActors;
  23. import com.atlassian.jira.security.roles.RoleActor;
  24. import com.atlassian.jira.util.I18nHelper;
  25. import com.google.common.base.Function;
  26. import com.google.common.collect.ImmutableList;
  27. import com.google.common.collect.Iterables;
  28. import com.google.common.collect.LinkedListMultimap;
  29. import com.google.common.collect.ListMultimap;
  30. import javax.annotation.Nonnull;
  31. import java.util.Collection;
  32. import java.util.List;
  33. import java.util.Locale;
  34. import static com.atlassian.jira.auditing.handlers.HandlerUtils.requestIfThereAreAnyValues;
  35. import static org.apache.commons.lang3.StringUtils.defaultIfEmpty;
  36. import static org.apache.commons.lang3.StringUtils.join;
  37. /**
  38. * @since v6.2
  39. */
  40. public class ProjectEventHandlerImpl implements ProjectEventHandler {
  41. private final I18nHelper.BeanFactory i18n;
  42. private final ProjectManager projectManager;
  43. public ProjectEventHandlerImpl(final I18nHelper.BeanFactory i18n, final ProjectManager projectManager) {
  44. this.i18n = i18n;
  45. this.projectManager = projectManager;
  46. }
  47. @Override
  48. public RecordRequest onProjectCreatedEvent(final ProjectCreatedEvent event) {
  49. return new RecordRequest(AuditingCategory.PROJECTS, "jira.auditing.project.created")
  50. .forObject(new AffectedProject(event.getProject()))
  51. .withAssociatedItems(getUserByProjectLeadChange(event.getProject()))
  52. .withChangedValues(buildChangedValues(event.getProject()));
  53. }
  54. @Override
  55. public Option<RecordRequest> onProjectUpdatedEvent(final ProjectUpdatedEvent event) {
  56. return requestIfThereAreAnyValues(
  57. buildChangedValues(event.getOldProject(), event.getProject()),
  58. new Function<List<ChangedValue>, RecordRequest>() {
  59. @Override
  60. public RecordRequest apply(final List<ChangedValue> changedValues) {
  61. return new RecordRequest(AuditingCategory.PROJECTS, "jira.auditing.project.updated")
  62. .forObject(new AffectedProject(event.getProject()))
  63. .withAssociatedItems(getUserByProjectLeadChange(event.getOldProject(), event.getProject()))
  64. .withChangedValues(changedValues);
  65. }
  66. });
  67. }
  68. @Override
  69. public RecordRequest onProjectDeletedEvent(final ProjectDeletedEvent event) {
  70. return new RecordRequest(AuditingCategory.PROJECTS, "jira.auditing.project.deleted")
  71. .forObject(new AffectedProject(event.getProject()));
  72. }
  73. @Override
  74. public RecordRequest onProjectCategoryChangeEvent(final ProjectCategoryChangeEvent event) {
  75. return new RecordRequest(AuditingCategory.PROJECTS, "jira.auditing.project.category.changed")
  76. .forObject(AssociatedItem.Type.PROJECT, event.getProject().getName(), event.getProject().getId().toString())
  77. .withChangedValues(buildChangedValuesForCategoryChange(event.getOldProjectCategory(), event.getNewProjectCategory()));
  78. }
  79. @Override
  80. public RecordRequest onProjectAvatarUpdateEvent(ProjectAvatarUpdateEvent event) {
  81. return new RecordRequest(AuditingCategory.PROJECTS, "jira.auditing.project.avatar.changed")
  82. .forObject(AssociatedItem.Type.PROJECT, event.getProject().getName(), event.getProject().getId().toString());
  83. }
  84. @Override
  85. public RecordRequest onProjectRoleUpdatedEvent(final ProjectRoleUpdatedEvent event) {
  86. return new RecordRequest(AuditingCategory.PROJECTS, "jira.auditing.project.roles.changed")
  87. .forObject(AssociatedItem.Type.PROJECT_ROLE, event.getProjectRole().getName(), event.getProjectRole().getId().toString())
  88. .withAssociatedItem(AssociatedItem.Type.PROJECT, event.getProject().getName(), event.getProject().getId().toString())
  89. .withChangedValues(computeChangedValues(event.getOriginalRoleActors(), event.getRoleActors()));
  90. }
  91. @Override
  92. public RecordRequest onProjectRoleDeletedEvent(final ProjectRoleDeletedEvent event) {
  93. return new RecordRequest(AuditingCategory.PROJECTS, "jira.auditing.project.role.deleted")
  94. .forObject(AssociatedItem.Type.PROJECT_ROLE, event.getProjectRole().getName(), event.getProjectRole().getId().toString());
  95. }
  96. @Nonnull
  97. private List<ChangedValue> computeChangedValues(@Nonnull final ProjectRoleActors originalRoleActors, @Nonnull final ProjectRoleActors roleActors) {
  98. final ChangedValuesBuilder changedValues = new ChangedValuesBuilder();
  99. final ListMultimap<String, String> originalActors = getCategorisedActors(originalRoleActors);
  100. final List<String> originalUsers = originalActors.get(ProjectRoleActor.USER_ROLE_ACTOR_TYPE);
  101. final List<String> originalGroups = originalActors.get(ProjectRoleActor.GROUP_ROLE_ACTOR_TYPE);
  102. final ListMultimap<String, String> newActors = getCategorisedActors(roleActors);
  103. final List<String> newUsers = newActors.get(ProjectRoleActor.USER_ROLE_ACTOR_TYPE);
  104. final List<String> newGroups = newActors.get(ProjectRoleActor.GROUP_ROLE_ACTOR_TYPE);
  105. changedValues.addIfDifferent("admin.common.words.users", defaultIfEmpty(join(originalUsers, ", "), null), defaultIfEmpty(join(newUsers, ", "), null));
  106. changedValues.addIfDifferent("common.words.groups", defaultIfEmpty(join(originalGroups, ", "), null), defaultIfEmpty(join(newGroups, ", "), null));
  107. return changedValues.build();
  108. }
  109. @Nonnull
  110. private ListMultimap<String, String> getCategorisedActors(final ProjectRoleActors originalRoleActors) {
  111. final ListMultimap<String, String> result = LinkedListMultimap.create(2);
  112. for (RoleActor actor : originalRoleActors.getRoleActors()) {
  113. result.put(actor.getType(), actor.getParameter());
  114. }
  115. return result;
  116. }
  117. @Override
  118. public Option<RecordRequest> onProjectCategoryUpdateEvent(final ProjectCategoryUpdateEvent event) {
  119. final Collection<Project> projectsFromProjectCategory = projectManager.getProjectsFromProjectCategory(event.getOldProjectCategory());
  120. if (!projectsFromProjectCategory.isEmpty()) {
  121. final RecordRequest recordRequest = new RecordRequest(AuditingCategory.PROJECTS, "jira.auditing.project.category.updated")
  122. .forObject(AssociatedItem.Type.PROJECT_CATEGORY, event.getNewProjectCategory().getName())
  123. .withChangedValues(buildChangedValuesForCategoryUpdate(event.getOldProjectCategory(), event.getNewProjectCategory()))
  124. .withAssociatedItems(Iterables.transform(projectsFromProjectCategory, new Function<Project, AssociatedItem>() {
  125. @Override
  126. public AssociatedItem apply(final Project project) {
  127. return new AffectedProject(project);
  128. }
  129. }));
  130. return Option.option(recordRequest);
  131. } else {
  132. return Option.none();
  133. }
  134. }
  135. private ImmutableList<AssociatedItem> getUserByProjectLeadChange(Project project) {
  136. return getUserByProjectLeadChange(null, project);
  137. }
  138. private ImmutableList<AssociatedItem> getUserByProjectLeadChange(Project oldProject, Project project) {
  139. if (oldProject == null || !project.getProjectLead().equals(oldProject.getProjectLead())) {
  140. return ImmutableList.<AssociatedItem>of(new AffectedUser(project.getProjectLead()));
  141. } else {
  142. return ImmutableList.of();
  143. }
  144. }
  145. private List<ChangedValue> buildChangedValues(Project project) {
  146. return buildChangedValues(null, project);
  147. }
  148. private List<ChangedValue> buildChangedValues(final Project originalProject, final Project currentProject) {
  149. final ChangedValuesBuilder changedValues = new ChangedValuesBuilder();
  150. changedValues.addIfDifferent("common.words.name", originalProject == null ? null : originalProject.getName(), currentProject.getName());
  151. changedValues.addIfDifferent("common.words.key", originalProject == null ? null : originalProject.getKey(), currentProject.getKey());
  152. changedValues.addIfDifferent("common.concepts.description", originalProject == null ? null : originalProject.getDescription(), currentProject.getDescription());
  153. changedValues.addIfDifferent("common.concepts.url", originalProject == null ? null : originalProject.getUrl(), currentProject.getUrl());
  154. changedValues.addIfDifferent("common.concepts.projectlead", originalProject == null ? null : originalProject.getLeadUserName(), currentProject.getLeadUserName());
  155. changedValues.addIfDifferent("admin.projects.default.assignee", originalProject == null ? null : pre(originalProject.getAssigneeType()), pre(currentProject.getAssigneeType()));
  156. return changedValues.build();
  157. }
  158. private List<ChangedValue> buildChangedValuesForCategoryChange(final ProjectCategory oldProjectCategory, final ProjectCategory newProjectCategory) {
  159. final ChangedValuesBuilder changedValues = new ChangedValuesBuilder();
  160. return changedValues.addIfDifferent("common.concepts.category", getNameOrNone(oldProjectCategory), getNameOrNone(newProjectCategory)).build();
  161. }
  162. private List<ChangedValue> buildChangedValuesForCategoryUpdate(final ProjectCategory oldProjectCategory, final ProjectCategory newProjectCategory) {
  163. final ChangedValuesBuilder changedValues = new ChangedValuesBuilder();
  164. changedValues.addIfDifferent("common.concepts.name", oldProjectCategory.getName(), newProjectCategory.getName());
  165. changedValues.addIfDifferent("common.concepts.description", oldProjectCategory.getDescription(), newProjectCategory.getDescription());
  166. return changedValues.build();
  167. }
  168. private String pre(final Long assigneeType) {
  169. return getI18n().getText(ProjectAssigneeTypes.getPrettyAssigneeType(assigneeType));
  170. }
  171. protected I18nHelper getI18n() {
  172. // You must not cache I18nHelper
  173. return i18n.getInstance(Locale.ENGLISH);
  174. }
  175. private String getNameOrNone(final ProjectCategory category) {
  176. return (category != null) ? category.getName() : "None";
  177. }
  178. }