public void setCloseDate(DefaultIssue issue, @Nullable Date d, IssueChangeContext context) {
   Date dateWithoutMilliseconds = d == null ? null : DateUtils.truncate(d, Calendar.SECOND);
   if (!Objects.equals(dateWithoutMilliseconds, issue.closeDate())) {
     issue.setCloseDate(d);
     issue.setUpdateDate(context.date());
     issue.setChanged(true);
   }
 }
 public boolean setMessage(DefaultIssue issue, @Nullable String s, IssueChangeContext context) {
   if (!Objects.equals(s, issue.message())) {
     issue.setMessage(s);
     issue.setUpdateDate(context.date());
     issue.setChanged(true);
     return true;
   }
   return false;
 }
 public boolean setType(DefaultIssue issue, RuleType type, IssueChangeContext context) {
   if (!Objects.equals(type, issue.type())) {
     issue.setFieldChange(context, TYPE, issue.type(), type);
     issue.setType(type);
     issue.setUpdateDate(context.date());
     issue.setChanged(true);
     return true;
   }
   return false;
 }
 public boolean setIssueMoved(
     DefaultIssue issue, String newComponentUuid, IssueChangeContext context) {
   if (!Objects.equals(newComponentUuid, issue.componentUuid())) {
     issue.setFieldChange(context, FILE, issue.componentUuid(), newComponentUuid);
     issue.setComponentUuid(newComponentUuid);
     issue.setUpdateDate(context.date());
     issue.setChanged(true);
     return true;
   }
   return false;
 }
 public boolean setStatus(DefaultIssue issue, String status, IssueChangeContext context) {
   if (!Objects.equals(status, issue.status())) {
     issue.setFieldChange(context, STATUS, issue.status(), status);
     issue.setStatus(status);
     issue.setUpdateDate(context.date());
     issue.setChanged(true);
     issue.setSendNotifications(true);
     return true;
   }
   return false;
 }
 public boolean setGap(DefaultIssue issue, @Nullable Double d, IssueChangeContext context) {
   if (!Objects.equals(d, issue.gap())) {
     issue.setGap(d);
     issue.setUpdateDate(context.date());
     issue.setChanged(true);
     // Do not send notifications to prevent spam when installing the SQALE plugin,
     // and do not complete the changelog (for the moment)
     return true;
   }
   return false;
 }
 public boolean setAttribute(
     DefaultIssue issue, String key, @Nullable String value, IssueChangeContext context) {
   String oldValue = issue.attribute(key);
   if (!Objects.equals(oldValue, value)) {
     issue.setFieldChange(context, key, oldValue, value);
     issue.setAttribute(key, value);
     issue.setUpdateDate(context.date());
     issue.setChanged(true);
     return true;
   }
   return false;
 }
 public boolean setAuthorLogin(
     DefaultIssue issue, @Nullable String authorLogin, IssueChangeContext context) {
   if (!Objects.equals(authorLogin, issue.authorLogin())) {
     issue.setFieldChange(context, AUTHOR, issue.authorLogin(), authorLogin);
     issue.setAuthorLogin(authorLogin);
     issue.setUpdateDate(context.date());
     issue.setChanged(true);
     // do not send notifications to prevent spam when installing the developer cockpit plugin
     return true;
   }
   return false;
 }
 public boolean setResolution(
     DefaultIssue issue, @Nullable String resolution, IssueChangeContext context) {
   if (!Objects.equals(resolution, issue.resolution())) {
     issue.setFieldChange(context, RESOLUTION, issue.resolution(), resolution);
     issue.setResolution(resolution);
     issue.setUpdateDate(context.date());
     issue.setChanged(true);
     issue.setSendNotifications(true);
     return true;
   }
   return false;
 }
  @Test
  public void should_keep_changes_made_by_user() {
    DefaultIssue issue =
        new DefaultIssue()
            .setKey("ABCDE")
            .setRuleKey(RuleKey.of("squid", "AvoidCycles"))
            .setComponentKey("struts:org.apache.struts.Action")
            .setNew(false);

    // Before starting scan
    issue.setAssignee(null);
    issue.setCreationDate(DateUtils.parseDate("2012-01-01"));
    issue.setUpdateDate(DateUtils.parseDate("2012-02-02"));

    // Changed by scan
    issue.setLine(200);
    issue.setSeverity(Severity.BLOCKER);
    issue.setManualSeverity(false);
    issue.setAuthorLogin("simon");
    issue.setChecksum("CHECKSUM-ABCDE");
    issue.setResolution(null);
    issue.setStatus(Issue.STATUS_REOPENED);

    // Issue as seen and changed by end-user
    IssueDto dbIssue =
        new IssueDto()
            .setKee("ABCDE")
            .setRuleId(10)
            .setRuleKey("squid", "AvoidCycles")
            .setComponentUuid("100")
            .setComponentKey("struts:org.apache.struts.Action")
            .setLine(10)
            .setResolution(Issue.RESOLUTION_FALSE_POSITIVE)
            .setStatus(Issue.STATUS_RESOLVED)
            .setAssignee("arthur")
            .setSeverity(Severity.MAJOR)
            .setManualSeverity(false);

    new UpdateConflictResolver().mergeFields(dbIssue, issue);

    assertThat(issue.key()).isEqualTo("ABCDE");
    assertThat(issue.componentKey()).isEqualTo("struts:org.apache.struts.Action");

    // Scan wins on :
    assertThat(issue.line()).isEqualTo(200);
    assertThat(issue.severity()).isEqualTo(Severity.BLOCKER);
    assertThat(issue.manualSeverity()).isFalse();

    // User wins on :
    assertThat(issue.assignee()).isEqualTo("arthur");
    assertThat(issue.resolution()).isEqualTo(Issue.RESOLUTION_FALSE_POSITIVE);
    assertThat(issue.status()).isEqualTo(Issue.STATUS_RESOLVED);
  }
 public boolean setManualSeverity(
     DefaultIssue issue, String severity, IssueChangeContext context) {
   if (!issue.manualSeverity() || !Objects.equals(severity, issue.severity())) {
     issue.setFieldChange(context, SEVERITY, issue.severity(), severity);
     issue.setSeverity(severity);
     issue.setManualSeverity(true);
     issue.setUpdateDate(context.date());
     issue.setChanged(true);
     issue.setSendNotifications(true);
     return true;
   }
   return false;
 }
 public boolean setSeverity(DefaultIssue issue, String severity, IssueChangeContext context) {
   if (issue.manualSeverity()) {
     throw new IllegalStateException("Severity can't be changed");
   }
   if (!Objects.equals(severity, issue.severity())) {
     issue.setFieldChange(context, SEVERITY, issue.severity(), severity);
     issue.setSeverity(severity);
     issue.setUpdateDate(context.date());
     issue.setChanged(true);
     return true;
   }
   return false;
 }
Exemple #13
0
  public DefaultIssue createManualIssue(
      String componentKey,
      RuleKey ruleKey,
      @Nullable Integer line,
      @Nullable String message,
      @Nullable String severity) {
    verifyLoggedIn();

    DbSession dbSession = dbClient.openSession(false);
    try {
      Optional<ComponentDto> componentOptional =
          dbClient.componentDao().selectByKey(dbSession, componentKey);
      if (!componentOptional.isPresent()) {
        throw new BadRequestException(
            String.format("Component with key '%s' not found", componentKey));
      }
      ComponentDto component = componentOptional.get();
      ComponentDto project =
          dbClient.componentDao().selectOrFailByUuid(dbSession, component.projectUuid());

      userSession.checkComponentPermission(UserRole.USER, project.getKey());
      if (!ruleKey.isManual()) {
        throw new IllegalArgumentException(
            "Issues can be created only on rules marked as 'manual': " + ruleKey);
      }
      Rule rule = getNullableRuleByKey(ruleKey);
      if (rule == null) {
        throw new IllegalArgumentException("Unknown rule: " + ruleKey);
      }

      DefaultIssue issue =
          new DefaultIssueBuilder()
              .componentKey(component.getKey())
              .projectKey(project.getKey())
              .line(line)
              .message(!Strings.isNullOrEmpty(message) ? message : rule.getName())
              .severity(Objects.firstNonNull(severity, Severity.MAJOR))
              .ruleKey(ruleKey)
              .reporter(userSession.getLogin())
              .assignee(findSourceLineUser(dbSession, component.uuid(), line))
              .build();

      Date now = new Date();
      issue.setCreationDate(now);
      issue.setUpdateDate(now);
      issueStorage.save(issue);
      return issue;
    } finally {
      dbSession.close();
    }
  }
 /** Used to set the assignee when it was null */
 public boolean setNewAssignee(
     DefaultIssue issue, @Nullable String newAssignee, IssueChangeContext context) {
   if (newAssignee == null) {
     return false;
   }
   checkState(
       issue.assignee() == null,
       "It's not possible to update the assignee with this method, please use assign()");
   issue.setFieldChange(context, ASSIGNEE, UNUSED, newAssignee);
   issue.setAssignee(newAssignee);
   issue.setUpdateDate(context.date());
   issue.setChanged(true);
   issue.setSendNotifications(true);
   return true;
 }
 /** Used to set the author when it was null */
 public boolean setNewAuthor(
     DefaultIssue issue, @Nullable String newAuthorLogin, IssueChangeContext context) {
   if (isNullOrEmpty(newAuthorLogin)) {
     return false;
   }
   checkState(
       issue.authorLogin() == null,
       "It's not possible to update the author with this method, please use setAuthorLogin()");
   issue.setFieldChange(context, AUTHOR, null, newAuthorLogin);
   issue.setAuthorLogin(newAuthorLogin);
   issue.setUpdateDate(context.date());
   issue.setChanged(true);
   // do not send notifications to prevent spam when installing the developer cockpit plugin
   return true;
 }
 public boolean assign(DefaultIssue issue, @Nullable User user, IssueChangeContext context) {
   String sanitizedAssignee = null;
   if (user != null) {
     sanitizedAssignee = StringUtils.defaultIfBlank(user.login(), null);
   }
   if (!Objects.equals(sanitizedAssignee, issue.assignee())) {
     String newAssigneeName = user != null ? user.name() : null;
     issue.setFieldChange(context, ASSIGNEE, UNUSED, newAssigneeName);
     issue.setAssignee(sanitizedAssignee);
     issue.setUpdateDate(context.date());
     issue.setChanged(true);
     issue.setSendNotifications(true);
     return true;
   }
   return false;
 }
 public boolean setEffort(
     DefaultIssue issue, @Nullable Duration value, IssueChangeContext context) {
   Duration oldValue = issue.effort();
   if (!Objects.equals(value, oldValue)) {
     issue.setEffort(value != null ? value : null);
     issue.setFieldChange(
         context,
         TECHNICAL_DEBT,
         oldValue != null ? oldValue.toMinutes() : null,
         value != null ? value.toMinutes() : null);
     issue.setUpdateDate(context.date());
     issue.setChanged(true);
     return true;
   }
   return false;
 }
  public boolean setTags(DefaultIssue issue, Collection<String> tags, IssueChangeContext context) {
    Set<String> newTags =
        Sets.newHashSet(
            Collections2.transform(
                Collections2.filter(
                    tags,
                    new Predicate<String>() {
                      @Override
                      public boolean apply(@Nullable String tag) {
                        return tag != null && !tag.isEmpty();
                      }
                    }),
                new Function<String, String>() {
                  @Override
                  public String apply(String tag) {
                    String lowerCaseTag = tag.toLowerCase(Locale.ENGLISH);
                    RuleTagFormat.validate(lowerCaseTag);
                    return lowerCaseTag;
                  }
                }));

    Set<String> oldTags = Sets.newHashSet(issue.tags());

    if (!oldTags.equals(newTags)) {
      issue.setFieldChange(
          context,
          TAGS,
          oldTags.isEmpty() ? null : CHANGELOG_TAG_JOINER.join(oldTags),
          newTags.isEmpty() ? null : CHANGELOG_TAG_JOINER.join(newTags));
      issue.setTags(newTags);
      issue.setUpdateDate(context.date());
      issue.setChanged(true);
      issue.setSendNotifications(true);
      return true;
    }
    return false;
  }
 public void addComment(DefaultIssue issue, String text, IssueChangeContext context) {
   issue.addComment(DefaultIssueComment.create(issue.key(), context.login(), text));
   issue.setUpdateDate(context.date());
   issue.setChanged(true);
 }